如何一次将多个整数传递给一个向量?
Posted
技术标签:
【中文标题】如何一次将多个整数传递给一个向量?【英文标题】:How do I pass multiple ints into a vector at once? 【发布时间】:2013-01-11 18:51:47 【问题描述】:目前我必须多次使用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()
并将多个值传递给向量?
【问题讨论】:
How do you copy the contents of an array to a std::vector in C++ without looping?的可能重复 【参考方案1】:你可以用初始化列表来做到这一点:
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 );
【讨论】:
我更喜欢这个答案而不是接受的答案,因为它确实适用于非空向量。 我更喜欢这个答案而不是接受的答案,因为它是单行的,适合因为它是一个微不足道的用例 我更喜欢这个答案,因为它不仅限于初始化。我正在寻找一种在向量初始化并包含数据后添加多个新元素的解决方案。【参考方案2】:尝试将数组传递给向量:
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> v2,5,8,11,14;
或者
std::vector<int> v = 2,5,8,11,14;
【讨论】:
另外两个方法需要用C++11启用,如果你用g++,编译用g++ -std=c++11
但是如果您需要在初始化之后传递多个值怎么办。如果没有大量 push_back 调用,我们将如何做到这一点?
但是这样会清除之前的内容。 OP 想要等效于多个推送操作。我认为解决方案是使用后插入器/vector::insert。
@David 你可以使用std::vector::insert
【参考方案3】:
您也可以使用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
【讨论】:
在 C++11 中,有更好的解决方案std::end(a)
可用。
谢谢,我不知道。也许您可以将其添加为新答案?
这是一个太小的变化,值得一个新的答案。让我们将其保留为评论(或者您可以编辑您的答案)。
a+5 不好。使用 a+(sizeof(a)/sizeof(int)) 。每次向“a”添加元素时都无需更新该语句。
@DivyangPatel,更好的是使用 a+(sizeof(a)/sizeof(*a)),它适用于任何数组类型(因此复制粘贴更安全)。【参考方案4】:
使用 vector::insert (const_iterator position, initializer_list il); http://www.cplusplus.com/reference/vector/vector/insert/
#include <iostream>
#include <vector>
int main()
std::vector<int> vec;
vec.insert(vec.end(),1,2,3,4);
return 0;
【讨论】:
您的回答对 Kosiek 的回答没有任何贡献【参考方案5】:你也可以使用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;
【讨论】:
【参考方案6】:这是三种最直接的方法:
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
【讨论】:
【参考方案7】:由于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;
【讨论】:
又名折叠表达式【参考方案8】:现在 (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));
【讨论】:
【参考方案9】:是的,你可以:
vector<int>TestVector;`
for(int i=0;i<5;i++)
TestVector.push_back(2+3*i);
【讨论】:
此解决方案避免了重复代码,但函数 push_back 仍会被多次调用,可能不是提问者想要的。 (代码格式也关闭了。) 好吧,他要求使用 push_back 一次,但我认为它的功能必须是多重的以上是关于如何一次将多个整数传递给一个向量?的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins作业无法在构建期间将整数参数传递给python脚本