【问题标题】:Add multiple values to a vector向向量添加多个值
【发布时间】:2015-01-08 10:06:33
【问题描述】:

我有一个整数向量,我也想添加多个值,但是使用大量 push_backs 添加的值太多。有没有在向量末尾添加多个值的方法。类似这样的东西:

std::vector<int> values
values += {3, 9, 2, 5, 8, etc};

我发现 boost 有类似的东西,但我不想包含 boost。

#include <boost/assign/std/vector.hpp>

using namespace boost::assign;

{
    std::vector<int> myElements;
    myElements += 1,2,3,4,5;
}

这似乎是这样声明的:

template <class V, class A, class V2>
inline list_inserter<assign_detail::call_push_back<std::vector<V,A> >, V> 
operator+=( std::vector<V, A>& c, V2 v )
{
    return push_back( c )( v );
}

是否有任何 C++/C++11 方法可以做到这一点,或者如果没有,将如何实现?

【问题讨论】:

标签: c++ vector addition


【解决方案1】:

也许insert:

values.insert( values.end(),  {3, 9, 2, 5, 8, etc} );

Demo.

【讨论】:

    【解决方案2】:

    这应该可行:

    std::vector<int> values;
    values.insert( values.end(), { 1, 2, 3, 4 } );
    

    【讨论】:

      【解决方案3】:

      你可以只做一个运算符:

      template <class T>
      std::vector<T>& operator+=(std::vector<T>& lhs, std::initializer_list<T> l)
      {
          lhs.insert(std::end(lhs), l);
          return lhs;
      }
      

      【讨论】:

      • 有一个烦人的问题,我从来没有真正找到一个好的解决方案;如果将此函数放在全局命名空间中,然后尝试在定义了完全不同的operator+= 的命名空间中使用它,则此函数将被隐藏。要解决此问题,您必须在声明另一个 operator+= 的任何命名空间中执行 using ::operator+=。 ADL 找不到这个,因为它只会检查 namespace std(我们不能把它放在 namespace std 中,因为用户代码不能这样做)。
      • @MattMcNabb 我知道这一点。我应该对此添加评论。
      • @0x499602D2:现在还为时不晚!
      【解决方案4】:

      您可以模仿提升 boost::assign 的行为

      template <typename T> 
      class vector_adder 
      {
      public:
          std::vector<T>& v;
          vector_adder(std::vector<T>& v):v(v)
          {  }
      
          vector_adder& operator,(const T& val)
          {  
             v.push_back(val);
             return *this;
          }
      };
      
      template <typename T> 
      vector_adder<T> operator+=(std::vector<T>& v,const T& x)
      {
          return vector_adder<T>(v),x;
      }
      

      那么,

       std::vector<int> v {1,2,3,4};
       v += 11,12,13,14 ;
      

      here

      【讨论】:

        【解决方案5】:

        为了提供尽可能多的解决方案,这也应该有效:

        for(const auto x : {11, 12, 13, 14})
            v.push_back(x);
        

        Demo.

        【讨论】:

        • 如果你知道你将增加 N > 1 的大小,你应该在添加值之前调用v.reserve 来适当地增加保留的大小。或者使用v.insert,如上所述。
        【解决方案6】:

        您可以通过使用插入成员函数来做到这一点,例如:

        vector<int> v; 
        int myarr[] {1, 2, 4, 5, 5, 6, 6, 8}; //brace initialization with c++11
        
        v.insert(v.end(), myarr, myarr+8);
        

        之前有一个答案在插入参数中省略了中间参数,但是那个不起作用。 insert方法有几种格式可以遵循,可以在here找到,我写的代码sn-p实际上遵循这种格式:

        vectorName.insert(开始输入值的位置,要输入的第一个值,要输入多少个值)

        注意:最后两个参数(即 myarr、myarr+8)使用指针算法。 myarr 是数组中第一个元素在内存中的地址,第二个值是第 8 个元素的地址。你可以阅读指针算法here

        希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-17
          • 2013-12-24
          • 2013-05-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-28
          • 1970-01-01
          相关资源
          最近更新 更多