首页 文章

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

提问于
浏览
179

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

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

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

但是当我这样做的时候,

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

要么

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

它给出了一个错误:

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

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

分别 .

2 回答

  • 28

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

    你也可以这样做:

    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;
    

相关问题