Можно ли инициализировать вектор в С++, как в Matlab?

В Matlab вы можете инициализировать векторы следующим образом:

>> a = 3;
>> b = 4.6;
>> c = [2, 1.3, a, b]

c =

    2.0000    1.3000    3.0000    4.6000

Я хотел бы использовать аналогичный синтаксис в C++. В частности, у меня есть собственный векторный класс Vec:

class Vec {
public:
    unsigned N; //number of elements
    double* e; //array of elements
    Vec(unsigned); //constructor
    ~Vec(void); //destructor
    Vec(const Vec&); //copy constructor
    Vec& operator=(const Vec&); //copy assignment operator
};

И я хотел бы инициализировать его следующим образом:

Vec v;
int a = 3;
double b = 4.6;

v = {2, 1.3, a, b}; //a is converted from int to double

std::cout << "N = " << v.N << std::endl;
std::cout << "v = [" << v.e[0] << ", " << v.e[1] << ", "
          << v.e[2] << ", " << v.e[3] << "]" << std::endl;

Чтобы он печатал:

N = 4
v = [2, 1.3, 3, 4.6]

Это возможно? Если да, то как?


Аналогичный вопрос здесь, но ответ касается конструктора копирования, а не оператора присваивания копии.


person Wood    schedule 01.12.2014    source источник
comment
Вы можете прочитать о std::initializer_list.   -  person Some programmer dude    schedule 01.12.2014
comment
Вы можете использовать initializer_list, std::vector уже допускает этот синтаксис. Демо   -  person Cory Kramer    schedule 01.12.2014
comment
Я знаю о initializer_list, но до сих пор не знаю, как это сделать. Я пробовал Vec& operator=(const initializer_list<double>); и кучу других вещей, и это не сработало.   -  person Wood    schedule 01.12.2014


Ответы (1)


Просто используйте std::vector.

Если вы должны написать его самостоятельно с помощью массивов, вероятно, самый простой способ - сначала написать конструктор списка инициализаторов, как описано в вопросе, на который вы ссылались:

Vec(unsigned size) : N(size), e(new double[size]) {}

Vec(std::initializer_list<double> l) : Vec(l.size()) {
  std::copy(l.begin(), l.end(), e);
}

Затем напишите невыбрасываемое swap:

void swap(Vec& rhs) noexcept {
  std::swap(e, rhs.e);
  std::swap(N, rhs.N);
}

и, наконец, стандартный оператор присваивания:

Vec& operator=(Vec rhs) {
  swap(rhs);
  return *this;
}

Затем он преобразует initializer_list в Vec с помощью конструктора списка инициализаторов, а затем присваивает с помощью оператора присваивания.

А если серьезно, просто используйте std::vector.

person Chris Drew    schedule 01.12.2014