如何有效地用第二个值对向量对进行分组
How to group a vector pair by the second value efficiently?
我正在尝试将对向量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; });
如果你可以放松限制,一定要考虑全局优化,比如"我需要转换所有这些数据吗?">
但是,一旦你有了合理的东西,就不要再担心最快的技术或容器或其他什么了,开始用探查器进行测量。有时,你担心的事情最终会成为一个非问题,并且有一些不明显的成本源于你的问题域和输入数据以及代码的积累
相关文章:
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何有效地实现将向量的数据分配给多个变量?
- 如何在C++中有效地将数组移动到向量
- 如何有效地用第二个值对向量对进行分组
- 如何在 CUDA 中(有效地)将大量向量相互比较
- 如何使用C++有效地合并排序与向量
- 如何有效地规范化向量C++
- 为什么优先级队列是使用堆实现的,而我们可以更有效地使用向量来实现它
- 如何有效地对__m256i向量的字节进行重新排序(将int32_t转换为uint8_t)?
- 如何更有效地从向量或集合中擦除元素?
- 有效地将列/行插入到就地存储在行/列主向量的矩阵中
- 如何有效地传递 std::vector<cv::P oint3f> 的子向量作为参数(不拥有函数)
- 我如何有效地确定两个平行向量的比例因子
- 将一个STL向量有效地分配给另一个STL矢量(WSL问题)
- 如何有效地从文件一行又一行地读取数据(相同类型)到多个向量(vectros的向量)
- 如何有效地用向量填充结构
- 有效地将文件中的模式存储在向量中
- c++向量有效地添加元素