Как инициализировать вектор в C++ [дубликат]




Возможные Дубликаты:
C++: Самый простой способ инициализации вектора STL с жестко закодированными элементами






Я хочу инициализировать вектор, как мы делаем в случае массива.



пример



int vv[2] = {12, 43};


но когда я делаю это, как это,



vector<int> v(2) = {34, 23};


или



vector<int> v(2);
v = {0, 9};


выдает ошибку:




ожидается первичное-выражение до ‘{’ токен




и




ошибка: ожидаемый‘, ’ или‘; ’ before ' = ' token




соответственно.

584   2  

2 ответов:

С новым стандартом C++ (возможно, потребуется включить специальные флаги на вашем компиляторе) вы можете просто сделать:

std::vector<int> v { 34,23 };
// or
// std::vector<int> v = { 34,23 };

или еще:

std::vector<int> v(2);
v = { 34,23 };

на компиляторах, которые не поддерживают эту функцию (списки инициализаторов), но вы можете эмулировать это с помощью массива:

int vv[2] = { 12,43 };
std::vector<int> v(&vv[0], &vv[0]+2);

или, для случая присвоения существующему вектору:

int vv[2] = { 12,43 };
v.assign(&vv[0], &vv[0]+2);

как предложил Джеймс Канзе, он более надежен, чтобы иметь функции, которые дают вам начало и конец массив:

template <typename T, size_t N>
T* begin(T(&arr)[N]) { return &arr[0]; }
template <typename T, size_t N>
T* end(T(&arr)[N]) { return &arr[0]+N; }

и тогда вы можете сделать это без того, чтобы повторять за всех:

int vv[] = { 12,43 };
std::vector<int> v(begin(vv), end(vv));

вы также можете сделать так:

template <typename T>
class make_vector {
public:
  typedef make_vector<T> my_type;
  my_type& operator<< (const T& val) {
    data_.push_back(val);
    return *this;
  }
  operator std::vector<T>() const {
    return data_;
  }
private:
  std::vector<T> data_;
};

и использовать его так:

std::vector<int> v = make_vector<int>() << 1 << 2 << 3;

Comments

    Ничего не найдено.