Работа с valarray и струкутрами

176
24 декабря 2021, 04:50

Есть некоторая структура.

struct Chain{
  int x;
  int y;
  Chain operator+=(int k){
      x+=k;
      y+=2;
      return *this;
  }
};

Есть valarray типа Chain

zero = {0,0};
valarray <Chain> bead(zero,size);

Хочется использовать типо такого

bead+=5;

И добиться поведения, которое представлено в структуре. т.е из каждого элемента из bead его x изменялось на k, а у ровно на два

Answer 1
struct Chain {
    int x;
    int y;
    Chain(int k = 0) : x(k), y(0) {}
    Chain& operator+=(const Chain& k) {
        x += k.x;
        y += k.y + 2;
        return *this;
    }   
};
int main() {
    Chain zero; 
    valarray <Chain> bead(zero, 3);
    bead += 5; //5 неявно преобразится Chain(5)
    for (auto c : bead)
        cout << c.x << ' ' << c.y << '\n';
    return 0;
}
Answer 2

Оператор += должен быть определен для типа, который содержит контейнер (Chain в вашем случае), поэтому просто передать число не получится.

#include <iostream>
#include <valarray>
struct S
{
    int x, y;
    S operator += (const S &k)
    {
        x += k.x;
        y += k.y;
        return *this;
    }
};
void print(const std::valarray <S> &arr)
{
    for (const auto &s: arr) {
        std::cout << s.x << " " << s.y << "|";
    }
    std::cout << std::endl;
}
main()
{
    std::valarray <S> arr({0, 0}, 3);
    print(arr);  // 0 0|0 0|0 0|
    arr += {3, 2};
    print(arr);  // 3 2|3 2|3 2|
}
Answer 3

Вы могли бы объявить оператор += для типов std::valarray<Chain> и int.

Это даст вам возможность делать bead+=5;

#include <algorithm>
#include <iostream>
#include <valarray>
struct Chain{
  int x;
  int y;
  Chain operator+=(int k){
      x+=k;
      y+=2;
      return *this;
  }
};
void print_bead(const std::valarray <Chain> & input)
{
    for (const Chain & c: input)
    {
        std::cout << c.x << " " << c.y << "   ";
    }
    std::cout << std::endl;
}
void operator+=(std::valarray<Chain> & arr, const int amount)
{
    std::for_each(std::begin(arr), std::end(arr), [amount](Chain & c)
    {
        c+= amount;
    });
}

int main()
{
    constexpr std::size_t size = 3;
    std::valarray <Chain> bead({0, 0}, size);
    print_bead(bead); // 0 0   0 0   0 0
    bead += 5;
    print_bead(bead); // 5 2   5 2   5 2
    bead += 1;
    print_bead(bead); // 6 4   6 4   6 4   
}
READ ALSO
Поиск подстроки в std::vector&lt;string&gt;

Поиск подстроки в std::vector<string>

Подскажите как решить следующую задачу оптимальным путем:

129
Как передать массив в конструктор в C++?

Как передать массив в конструктор в C++?

Я реализовываю свой класс vector, но у меня возникла проблема: как передать в конструктор массив в таком виде: ClassName object = {1, 2, 3, 4, 5};?

179
Проверка ввода только одного символа

Проверка ввода только одного символа

Написать программу, печатающую символы от A до введенного с клавиатуры символа (последний возможный: Z)Для каждого символа вывести номер,...

94
Grace Dependency Injection breaks project

Grace Dependency Injection breaks project

Я начал писать проект с нуля, поэтому я хотел реализовать DependencyInjectionВыбрал Grace, потому что он уже реализован на старом проекте, его писал не я, так...

178