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

216
我想要像初始化数组一样初始化一个向量。
例子
int vv[2] = {12, 43};

但是当我这样做时,

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

或者

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

出现了错误:

在“{”符号之前需要主表达式

在“=”符号之前需要‘,’或‘;’

分别为对应的错误信息。


3
还有一种方法可以像C数组一样初始化'const std::vector<T>',详情请参见:https://dev59.com/6HVC5IYBdhLWcg3woSpW#254143。 - Shadow2531
你应该在编译器中启用C++11支持,例如:g++ -std=c++11 your_file.cc。然后你就可以使用线程的初始化列表构造函数(在此参考文献中的最后一项)。 - user283145
1
不是重复问题 - 另一个问题是如何使用旧的C ++进行操作,WTF的答案是现在如何操作。 - Martin Beckett
2个回答

291

使用新的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);

正如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; }

然后,您可以在不必重复尺寸的情况下执行此操作:

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

23
简单来说:std::vector<int> v(vv, vv+2);这行代码会创建一个整型向量 v,它包含了 vv 数组的前两个元素。 - Violet Giraffe
12
更加健壮的写法是:std::vector<int> v(begin(w), end(w));。在C++11中,beginend是标准函数(但此时你不需要它们),否则它们应该在你的工具箱中。 - James Kanze
2
我知道这是一个老问题,但你在这里到底在做什么: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()。 我知道我错过了什么。 - Mortimer McMire
2
我认为 std::vector<int> v(&vv[0], &vv[0]+2) 实际上是在调用该页面上的第四个构造函数。该构造函数可以取一个范围内的第一个和最后一个元素,并创建一个包含中间所有元素的向量。提示是 & 将导致内存地址。 - Prashant Kumar
1
@qed 我们从不手动删除向量,因为它们有一个析构函数,可以自动删除堆上的内容,并且当向量超出范围时,析构函数会自动调用。 - Buge
显示剩余9条评论

32
你也可以像这样做:
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;

2
能否将 data_ 移动到 v 而不是调用复制构造函数? - Per
2
你好Per!我想你会喜欢这个(警告,未经测试): operator std::vector<T>&& () { return std::move(data_); } - Viktor Sehr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接