如何在C++中初始化向量

Md *_*sal 191 c++ arrays declaration vector

可能重复:
C++:使用硬编码元素初始化STL向量的最简单方法

我想像数组一样初始化一个向量.

int vv[2] = {12, 43};
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候,

vector<int> v(2) = {34, 23};
Run Code Online (Sandbox Code Playgroud)

要么

vector<int> v(2);
v = {0, 9};
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误:

在'{'标记之前预期的primary-expression

错误:预期','或';' 在'='之前

分别.

R. *_*des 260

使用新的C++标准(可能需要在编译器上启用特殊标志),您可以简单地执行:

std::vector<int> v { 34,23 };
// or
// std::vector<int> v = { 34,23 };
Run Code Online (Sandbox Code Playgroud)

甚至:

std::vector<int> v(2);
v = { 34,23 };
Run Code Online (Sandbox Code Playgroud)

在不支持此功能的编译器(初始化列表)上,您可以使用数组模拟它:

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

或者,对于赋值给现有向量的情况:

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

就像James Kanze建议的那样,拥有能够为您提供数组开头和结尾的函数更加强大:

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; }
Run Code Online (Sandbox Code Playgroud)

然后你可以做到这一点,而不必重复大小:

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

  • 或者简单地说:std :: vector <int> v(vv,vv + 2); (21认同)
  • 或者更强大:`std :: vector <int> v(begin(w),end(w);`.`start`和`end`是C++ 11中的标准(但是你不需要它们) ),但应该在你的工具包中. (11认同)
  • 我知道这是一个老问题,但你到底在做什么:`std :: vector <int> v(&vv [0],&vv [0] +2);`?我看到的是,你正构造一个带有'&vv [0]`(它将是一个内存地址)值的空间的向量,并用`&vv [0] + 2`填充向量中的每个空格......将使用此页面上的构造函数2:http://en.cppreference.com/w/cpp/container/vector/vector,而不提供第三个参数,默认为Allocator().我知道我错过了什么. (2认同)
  • 我认为`std :: vector <int> v(&vv [0],&vv [0] +2)`实际上正在调用该页面上的第4个构造函数.构造函数可以获取范围中的第一个和最后一个元素,并创建一个包含其间所有内容的向量.tipoff是`&`将导致内存地址. (2认同)

Vik*_*ehr 29

你也可以这样做:

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_;
};
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

std::vector<int> v = make_vector<int>() << 1 << 2 << 3;
Run Code Online (Sandbox Code Playgroud)

  • 是否可以将 *data_* 移动到 *v* 而不是调用复制构造函数? (2认同)
  • 你好佩尔!我想你喜欢这个(警告,未经测试): op​​erator std::vector&lt;T&gt;&amp;&amp; () { return std::move(data_); } (2认同)