对 3D 向量对进行排序
Sorting a 3D vector of pairs
我声明了以下向量:
std::vector<std::vector<std::vector<std::pair<float, int>>>> depth;
我想按第一个元素升序对每个向量中的对进行排序。
排序:
for(std::vector<std::vector<std::pair<float,int>>> vec1 : depth) {
for(std::vector<std::pair<float,int>> vec2 : vec1) {
std::sort(vec2.begin(), vec2.end());
}
}
然后打印:
for (std::vector<std::vector<std::pair<float,int>>> vec1 : depth) {
for (std::vector<std::pair<float, int>> vec2 : vec1) {
if(!vec2.empty() && (vec2.size() > 1)) {
for (std::pair<float, int> pr : vec2) {
std::cout << pr.first << " " << pr.second << " ";
}
std::cout << std::endl;
}
}
}
部分结果:
4.65514 1 3.10343 2
4.67043 1 3.11362 2
4.68594 1 3.12396 2
应该如何:
3.10343 2 4.65514 1
3.11362 2 4.67043 1
3.12396 2 4.68594 1
感谢任何帮助,因为我确实 运行 无事可做,而且我无法弄清楚自己做错了什么。
正如 LogiStuff 在评论中所说,您正在整理副本。这是因为您使用 for-range 的方式有一个迭代变量,该变量是从范围的每个元素复制构造的。
要解决这个问题,您只需添加一个 &
以通过引用遍历范围,以便对向量进行就地排序。更好的是,使用 auto
向现代 C++ 迈进了一步:
for(auto &vec1 : depth) {
for(auto &vec2 : vec1) {
std::sort(vec2.begin(), vec2.end());
}
}
这里是online demo
我声明了以下向量:
std::vector<std::vector<std::vector<std::pair<float, int>>>> depth;
我想按第一个元素升序对每个向量中的对进行排序。
排序:
for(std::vector<std::vector<std::pair<float,int>>> vec1 : depth) {
for(std::vector<std::pair<float,int>> vec2 : vec1) {
std::sort(vec2.begin(), vec2.end());
}
}
然后打印:
for (std::vector<std::vector<std::pair<float,int>>> vec1 : depth) {
for (std::vector<std::pair<float, int>> vec2 : vec1) {
if(!vec2.empty() && (vec2.size() > 1)) {
for (std::pair<float, int> pr : vec2) {
std::cout << pr.first << " " << pr.second << " ";
}
std::cout << std::endl;
}
}
}
部分结果:
4.65514 1 3.10343 2
4.67043 1 3.11362 2
4.68594 1 3.12396 2
应该如何:
3.10343 2 4.65514 1
3.11362 2 4.67043 1
3.12396 2 4.68594 1
感谢任何帮助,因为我确实 运行 无事可做,而且我无法弄清楚自己做错了什么。
正如 LogiStuff 在评论中所说,您正在整理副本。这是因为您使用 for-range 的方式有一个迭代变量,该变量是从范围的每个元素复制构造的。
要解决这个问题,您只需添加一个 &
以通过引用遍历范围,以便对向量进行就地排序。更好的是,使用 auto
向现代 C++ 迈进了一步:
for(auto &vec1 : depth) {
for(auto &vec2 : vec1) {
std::sort(vec2.begin(), vec2.end());
}
}
这里是online demo