如何有效地用第二个值对向量对进行分组

How to group a vector pair by the second value efficiently?

本文关键字:向量 有效地 第二个      更新时间:2023-10-16

我正在尝试将对向量vector<pair<int,int>>的第二个值分组。例如,如果对是v0 : (0,1),(1,1),(3,2),(4,2),(5,1)。我想要两个输出。第一个是第二个元素中唯一的元素,即

vector<int> v2={1,2};

第二种是第一组元素,可以是

vector<vector<int>>v1;
v1[0]={0,1,5};
v1[1]={3,4};

如何以有效的方式实现这一点?在group过程之前,我是否需要首先按第二个元素对v0进行排序?std::map是一种更快的方式吗?不仅方法,我还关心速度。因为我的v0是一个很长且未排序的三角形网格顶点索引列表。任何建议都将不胜感激。更新后,我发现了一个类似链接的解决方案。这是一种无序的方式。我不知道它的速度。

map<int, vector<int> > vpmap;
for (auto it = v0.begin(); it != v0.end(); ++it) {
vpmap[(*it).second].push_back((*it).first);
};

其中vpmap.first对应于v2;并且CCD_ 9对应于CCD_。

您所拥有的是一种获得所需确切数据结构的性能合理的方法。确保预先分配向量,因为您知道向量的大小,并使用移动迭代器来避免不必要的复制:

std::vector<int> v0;
std::vector<std::vector<int>> v1;
v0.reserve(vpmap.size());
std::transform(vpmap.begin(), vpmap.end(), std::back_inserter(v0), [](auto p) { return p.first; });
v1.reserve(vpmap.size());
std::transform(make_move_iterator(vpmap.begin()), make_move_iterator(vpmap.end()), std::back_inserter(v1), [](auto p) { return p.second; });

如果你可以放松限制,一定要考虑全局优化,比如"我需要转换所有这些数据吗?">

但是,一旦你有了合理的东西,就不要再担心最快的技术或容器或其他什么了,开始用探查器进行测量。有时,你担心的事情最终会成为一个非问题,并且有一些不明显的成本源于你的问题域和输入数据以及代码的积累