如何一次将多个整数传递给向量?

99

目前,当我需要多次使用 vector.push_back() 时,我正在使用以下代码:

  std::vector<int> TestVector;
  TestVector.push_back(2);
  TestVector.push_back(5);
  TestVector.push_back(8);
  TestVector.push_back(11);
  TestVector.push_back(14);

有没有一种方法只使用vector.push_back()一次,并将多个值传递到向量中?


8个回答

154

您可以使用初始化列表来完成:

std::vector<unsigned int> array;

// First argument is an iterator to the element BEFORE which you will insert:
// In this case, you will insert before the end() iterator, which means appending value
// at the end of the vector.
array.insert(array.end(), { 1, 2, 3, 4, 5, 6 });

13
我更喜欢这个答案,因为它适用于非空向量。 - YSC
2
我更喜欢这个答案而不是被接受的那个,因为它只有一行代码,这很适合因为这是一个微不足道的使用情况。 - IceFire
2
我更喜欢这个答案,因为它不仅限于初始化。我正在寻找一个可以在向量已经初始化并包含数据的情况下添加多个新元素的解决方案。 - Martí
我在添加标量时遇到错误: src//main.cpp:11:30: error: expected expression stack1.insert(stack1.end(), {2, 4, 6, 8, 1, 3, 5, 7, 9}); 你知道为什么会出现这种情况吗? - DrSocket
一个很好的回答,尽管将向量命名为"array"并不理想。 - Yun

79
尝试将数组传递给向量:
int arr[] = {2,5,8,11,14};
std::vector<int> TestVector(arr, arr+5);

你可以随时调用std::vector::assign将数组分配给向量,调用std::vector::insert来添加多个数组。

如果你使用C++11,你可以尝试:

std::vector<int> v{2,5,8,11,14};

或者

std::vector<int> v = {2,5,8,11,14};

1
另外两种方法需要启用C++11,如果您使用g++编译,请使用g++ -std=c++11进行编译。 - billz
15
如果你需要在初始化后传递多个值,那该怎么办呢?如何避免大量的 push_back 调用? - David G
但这将清除先前的内容。OP想要多个push操作的等效操作。我认为解决方案是使用一个后插入器/ vector :: insert。 - leemes
1
@David,你可以使用std::vector::insert - juanchopanza

78

您也可以使用vector::insert

std::vector<int> v;
int a[5] = {2, 5, 8, 11, 14};

v.insert(v.end(), a, a+5);

编辑:

当然,在实际编程中,你应该使用:

v.insert(v.end(), a, a+(sizeof(a)/sizeof(a[0])));  // C++03
v.insert(v.end(), std::begin(a), std::end(a));     // C++11

11
在C++11中,有更好的解决方案 std::end(a) 可用。 - leemes
1
谢谢,我不知道这个。也许你可以把它作为一个新答案添加进去? - sashoalm
1
a+5 不好。使用 a+(sizeof(a)/sizeof(int))。无需在向“a”添加元素时更新该语句。 - deepdive
@DivyangPatel,更好的方法是使用a +(sizeof(a)/ sizeof(* a)),这适用于任何数组类型(因此更安全,可以复制粘贴)。 - Steed
@sashoalm 你的观点是正确的。但我的意见是针对实际编程的补充... :):) - deepdive
显示剩余2条评论

5

以下是三种最直接的方法:

1)从初始化列表初始化:

std::vector<int> TestVector = {2,5,8,11,14};

2) 通过初始化列表进行赋值:

std::vector<int> TestVector;
TestVector.assign( {2,5,8,11,14} ); // overwrites TestVector

3) 在给定位置插入初始化列表:

std::vector<int> TestVector;
...
TestVector.insert(end(TestVector), {2,5,8,11,14} ); // preserves previous elements

4

你也可以使用 Boost.Assignment

const list<int> primes = list_of(2)(3)(5)(7)(11);

vector<int> v; 
v += 1,2,3,4,5,6,7,8,9;

2

c++17 开始,您可以使用以下方法:

#include <iostream>
#include <vector>

using namespace std;

vector<int> vec;
template<typename... T>
void vecPush(const T& ... x) {
    (vec.push_back(x), ...);
}

int main() {
    vecPush(4, 10, 4);
    for(const auto& a : vec)
        cout << a << " ";
    return 0;
}

1
aka fold expressions - Vegeta

1
这些天(c++17),很容易:
auto const pusher([](auto& v) noexcept
  {
    return [&](auto&& ...e)
      {
        (
          (
            v.push_back(std::forward<decltype(e)>(e))
          ),
          ...
        );
      };
  }
);

pusher(TestVector)(2, 5, 8, 11, 14);

编辑:对于真正有冒险精神的人(C++20):

template <typename F, class Tuple>
constexpr void operator|(Tuple&& t, F f)
{
  [&]<auto ...I>(std::index_sequence<I...>) noexcept(noexcept((f(std::get<I>(t)), ...)))
  {
    (f(std::get<I>(t)), ...);
  }
  (std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<Tuple>>>());
}

std::forward_as_tuple(2, 5, 8, 11, 14) | [&](auto&& e){ TestVector.push_back(std::forward<decltype(e)>(e)); }

你告诉我这样比简单地多次使用push_back()更易读和直观? - undefined
@higuaro 我不能/不应该抄袭其他答案。 - undefined

-3

可以的,在你的情况下:

vector<int>TestVector;`
for(int i=0;i<5;i++)
{

    TestVector.push_back(2+3*i);
    
} 

4
这种解决方案避免了重复的代码,但函数 push_back 仍会被多次调用,可能不符合提问者的要求。(代码格式也有问题。) - Viktoriya Malyasova
好的,他要求使用push_back一次,但它的功能必须是多个,我想。 - Probol

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