【问题标题】:Convert two vectors of int with the same length into one vector of pairs of int in C++在 C++ 中将两个长度相同的 int 向量转换为一个 int 对向量
【发布时间】: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


【解决方案1】:

您可以为此使用算法:

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() 中。在这种特殊情况下,显式循环也会更短更清晰。
  • @Karadur:如果不以某种方式迭代元素,就不能对 N 个元素应用操作,这很明显:压缩两个序列不能在 O(1) 中完成。这个问题也很清楚需要什么:我们可以使用合适的 STL 函数和迭代器来做到这一点吗?。这个答案正是这样做的。
  • 你甚至可以省略 lambda 并直接使用 make_pair,不是吗?
  • @jrok:我不这么认为,因为make_pair 不是一个有效的函子,另一方面,make_pair&lt;int, int&gt; 可能确实有效……这也不能作为 @ 的实现987654326@ 基于“通用引用”,如果你取出类型推导,它就会变成右值引用……
  • @MFH 是的,我不是说没有模板参数。像make_pair&lt;int&amp;,int&amp;&gt; 这样的东西应该可以工作,虽然看起来有点奇怪。
【解决方案2】:

我同意 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 中也隐藏着一个潜在的循环
  • 嗯,是的,但是如果发生重新分配。感谢您的提示,我会更新我的答案
  • “但是,对于大多数人来说,这个版本更加可读和清晰” - 是的,对于那些不熟悉标准库(以及 C++)的人来说。它根本没有真正回答这个问题,是吗?
  • @ChristianRau 您的假设没有意义。我熟悉标准库和 C++,但我发现这段代码更具可读性和清晰性。至少有 3 人投了赞成票,所以我并不孤单。这段代码确实回答了这个问题(我正在使用“合适的 STL 函数” - 例如std::make_pair。)我只是拒绝使用 STL 代码,除非它具有降低的复杂性和更好的可读性。我不会盲目地使用 STL,尤其是当它看起来更加冗长和难看的时候。简单是关键,我的朋友 :)
  • 好吧,至少您删除了 “大多数人” 会发现它更具可读性和清晰性的断言。但不幸的是,它并没有改变帖子的未答复情况。答案不是为了取消最初的问题的资格,这就是 cmets 的用途。您很可能会发现他的方法不合适并为此提供了充分的理由,但这并不会改变他问题的有效性和可回答性。当然,想要使用标准库算法而不是循环,不管是否也想要它。
猜你喜欢
  • 1970-01-01
  • 2011-09-17
  • 2022-06-17
  • 1970-01-01
  • 2015-07-27
  • 2015-03-28
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多