c++中最快的从成对向量转换为两个独立向量的方法
Fastest way to convert from vector of pairs to two independent vectors in C++
假设我有一个pair<int,int>
的vector
。现在我想提取pair.first
和pair.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中的内容,以及实际的实现。根据这些,创建目标向量可能会更好正确的大小,并分配给它们;或者将它们创建为空,然后使用reserve
和push_back
。您可能还想比较索引使用迭代器;如果你用的是预大小的向量,只用一个控制变量而不是三个可能是一个改进。(g + +,上次我测量的时候,创建了正确大小的矢量分配比使用reserve
和push_back
要快,至少对于double
。尽管这意味着内部循环两次,而且初始化值为0.0
)
您可能还想尝试创建函数对象来提取一对的第一和第二元素(假设你没有它们已经),并使用两次调用transform
。还是用a预维向量或使用后插入器作为目标。马上,我。我不指望这样能提供更好的性能,但你永远不会知道。
无论如何你都必须遍历vector,所以就复杂度而言,这是你所能得到的最好的。
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 查找两个排序向量中共有的元素
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 如何根据两个因素组织向量:id 和数量?(C++)
- 在C++中查找两个向量之间最相似的值
- 如何在C++中从两个向量生成所有可能的对?
- 返回两个向量 – 使用引用还是元组?
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 检查两个向量是否并行的最有效方法
- 有没有办法将两个或多个不同的类链接到一个类中(稍后在向量上使用)?
- 我有一个返回字符串向量的函数.它需要两个字符串,并且返回一个字符串中缺少的字符串
- 如何获得比较两个向量对的子集
- C++将两个不同类型的向量的属性连接到新的向量中
- 如何组合两个整数向量
- 在两个类实例之间共享向量
- 如何在 c++ 中对两个向量进行线性搜索?
- 如何在 c++ 中从两个向量创建 JSON 对象?
- 为什么具有两个元素的发起器语法将一个元素而不是两个元素放入字符串向量中?