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

Fastest way to convert from vector of pairs to two independent vectors in C++

本文关键字:向量 两个 方法 独立 转换 c++      更新时间:2023-10-16

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

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

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的情况。但是,把代码写得通用一点也无妨,这样在将来的情况下就可以利用这一点。

如果复制/移动是一个问题,但是,您应该考虑是否为您的原始向量使用一些视图适配器可能是一个更好的方法。

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

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

您可能还想尝试创建函数对象来提取一对的第一和第二元素(假设你没有它们已经),并使用两次调用transform。还是用a预维向量或使用后插入器作为目标。马上,我。我不指望这样能提供更好的性能,但你永远不会知道。

无论如何你都必须遍历vector,所以就复杂度而言,这是你所能得到的最好的。