将具有相同长度的两个int向量转换为C++中的一对int对

Dav*_*Ren 10 c++ vector c++-standard-library

在C++中,如果我有两个向量int:

A = [1, 2, 3 ,4]; 
B = [1, 2, 3, 4]; 
Run Code Online (Sandbox Code Playgroud)

如何将它们合并到一对对矢量中:

[(1,1), (2,2), (3,3), (4, 4)]
Run Code Online (Sandbox Code Playgroud)

当然我可以通过循环来做到这一点.但是我们可以使用合适的STL函数和迭代器吗?

Die*_*ühl 20

你可以使用一个算法:

std::vector<std::pair<int, int>> target;
target.reserve(A.size());
std::transform(A.begin(), A.end(), B.begin(), std::back_inserter(target),
               [](int a, int b) { return std::make_pair(a, b); });
Run Code Online (Sandbox Code Playgroud)

  • @Karadur:你不能在不以某种方式迭代元素的情况下对N个元素应用操作,这很明显:在O(1)中不能完成两个序列的压缩.关于所需要的问题也很清楚:*我们可以使用合适的STL函数和迭代器吗?*.这个答案正是如此. (14认同)
  • 注意它实际上并没有帮助摆脱循环.循环将隐藏在`std :: transform()`中.在这种特殊情况下,显式循环也会更短更清晰. (2认同)

Ole*_*siy 6

我同意DietmarKühl的回答完全符合问题的要求,但我也同意Kakadur的评论.隐藏了一个循环,std::transform()因此复杂性是相同的.有些人会判断,但如果有一种方式是无法直接证明更好的比其他的,我倾向于选择最可读的和最详细的版本:

// create a vector of length of the smaller vector
std::vector<std::pair<int, int>> target( A.size() < B.size() ? A.size() : B.size() );

for (unsigned i = 0; i < target.size(); i++)
    target[i] = std::make_pair(A[i], B[i]);
Run Code Online (Sandbox Code Playgroud)

PS上面的代码为target向量分配了足够的空间,因此push_back可以避免(在重新分配的情况下)的潜在开销.