【发布时间】:2013-08-28 02:20:00
【问题描述】:
在 C++ 中,如果我有两个向量 int:
A = [1, 2, 3 ,4];
B = [1, 2, 3, 4];
如何将它们合并成一对向量:
[(1,1), (2,2), (3,3), (4, 4)]
当然,我可以通过循环来做到这一点。但是我们可以使用合适的 STL 函数和迭代器来做到这一点吗?
【问题讨论】:
标签: c++ vector c++-standard-library
在 C++ 中,如果我有两个向量 int:
A = [1, 2, 3 ,4];
B = [1, 2, 3, 4];
如何将它们合并成一对向量:
[(1,1), (2,2), (3,3), (4, 4)]
当然,我可以通过循环来做到这一点。但是我们可以使用合适的 STL 函数和迭代器来做到这一点吗?
【问题讨论】:
标签: c++ vector c++-standard-library
您可以为此使用算法:
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); });
【讨论】:
std::transform() 中。在这种特殊情况下,显式循环也会更短更清晰。
make_pair,不是吗?
make_pair 不是一个有效的函子,另一方面,make_pair<int, int> 可能确实有效……这也不能作为 @ 的实现987654326@ 基于“通用引用”,如果你取出类型推导,它就会变成右值引用……
make_pair<int&,int&> 这样的东西应该可以工作,虽然看起来有点奇怪。
我同意 Dietmar Kü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]);
附:
上面的代码为target 向量分配了足够的空间,因此可以避免push_back 的潜在开销(在重新分配的情况下)。
【讨论】:
push_back 中也隐藏着一个潜在的循环
std::make_pair。)我只是拒绝使用 STL 代码,除非它具有降低的复杂性和更好的可读性。我不会盲目地使用 STL,尤其是当它看起来更加冗长和难看的时候。简单是关键,我的朋友 :)