在C ++中从对向量转换为两个独立向量的最快方法

时间:2011-12-09 08:59:51

标签: c++ vector

假设我有vector pair<int,int>。现在我想将pair.firstpair.second提取为独立向量。我可以迭代向量并执行此操作但是有更好/更快的方法吗?

4 个答案:

答案 0 :(得分:12)

在C ++ 11中,如果你不再需要旧的向量,你可以从移动语义中获得一点额外的效率:

for (auto it = std::make_move_iterator(v.begin()),
         end = std::make_move_iterator(v.end()); it != end; ++it)
{
    v1.push_back(std::move(it->first));
    v2.push_back(std::move(it->second));
}

除此之外,你肯定不能比一个循环更好。你必须至少触摸一次每个元素,这样才能有效。

请注意,如果元素类型本身具有比复制更好的移动语义,则移动只会有所不同。对于int或任何POD,情况并非如此。但是一般编写代码并不会有什么坏处,这样你就可以在将来的情况下利用它。

如果复制/移动是个问题,你应该考虑原始载体的某个视图适配器是否是更好的方法。

答案 1 :(得分:3)

不,没有。要注意的一件事是在两个结果向量上使用reserve以防止不必要的重新分配。

答案 2 :(得分:2)

您将无法避免迭代。至于最快的解决方案, 它取决于对中的内容以及实际实现。 根据这些,可能更好地创建目标向量 正确的尺寸,并分配给他们;或者将它们创建为空,并使用 reserve然后push_back。您可能还想比较索引 使用迭代器;如果你使用的是预先调整大小的矢量,只使用一个 控制变量而不是三个可能是一个改进。 (使用g ++, 我最后一次测量,创建正确大小的矢量 分配比使用reservepush_back更快,至少对于。{ double。尽管它意味着在内部循环两次,并且 将值初始化为0.0。)

您可能还想尝试创建功能对象来提取 该对的第一和第二个元素(假设你没有它们 已经),并使用两次调用transform。再一次,要么是 预定位矢量或使用后插入器作为目标。我手边 不希望这会提供更好的表现,但你永远不会知道。

答案 3 :(得分:1)

无论如何你必须迭代向量,所以就复杂性来说,这是你能得到的最好的。