如何在 C++ 中初始化向量 [重复]

Posted

技术标签:

【中文标题】如何在 C++ 中初始化向量 [重复]【英文标题】:How to initialize a vector in C++ [duplicate] 【发布时间】:2012-02-12 23:03:07 【问题描述】:

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

例子

int vv[2] = 12, 43;

但是当我这样做时,

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

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

它给出了一个错误:

“”标记之前的预期主表达式

错误:在“=”标记之前应为“,”或“;”

分别。

【问题讨论】:

还有how-to initialize 'const std::vector<T>' like a c array。 您应该在编译器中启用 C++11 支持,例如g++ -std=c++11 your_file.cc。然后你可以使用线程的初始化列表构造函数(this reference中的最后一项) 不是骗子 - 另一个问题是如何用旧的 c++ 做到这一点,WTF 的答案是现在如何做到这一点 【参考方案1】:

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

【讨论】:

或者简单地说:std::vector v(vv, vv+2); 或更可靠:std::vector&lt;int&gt; v(begin(w), end(w);beginend 在 C++11 中是标准的(但你不需要它们),但应该在你的工具包中。 我知道这是一个老问题,但你到底在做什么:std::vector&lt;int&gt; v(&amp;vv[0], &amp;vv[0]+2);?我看到的是,您正在构建一个带有空间的向量,以容纳 &amp;vv[0](这将是一个内存地址)值,并用 &amp;vv[0]+2 填充向量中的每个空间......这将使用此页面上的构造函数 2 : en.cppreference.com/w/cpp/container/vector/vector 不提供第三个参数,默认为 Allocator()。我知道我错过了一些东西。 我认为std::vector&lt;int&gt; v(&amp;vv[0], &amp;vv[0]+2) 实际上是在调用该页面上的第四个构造函数。构造函数可以获取范围内的第一个和最后一个元素,并创建一个包含其间所有内容的向量。提示是&amp; 将产生内存地址。 @qed 我们从不手动删除向量,因为它们有一个析构函数会自动删除堆上的东西,并且当向量超出范围时会自动调用析构函数。【参考方案2】:

你也可以这样做:

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;

【讨论】:

是否可以将 data_ 移动到 v 而不是调用复制构造函数? 您好!我想你会这样做(警告,未经测试): op​​erator std::vector&& () return std::move(data_);

以上是关于如何在 C++ 中初始化向量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何初始化 2D 向量 C++ [重复]

如何在 C++ 中的字符串向量中找到重复的单词?

C++:如何检测向量中的重复项并打印一份?

如何在 C++ 中使用构造函数初始化二维向量?

如何在 C++ 中声明和初始化 2d int 向量?

如何在 MS 编译器中使用数组初始化 C++ 向量/集?