gpt4 book ai didi

c++ - 为什么内置排序无法对 vector 映射进行排序?

转载 作者:太空狗 更新时间:2023-10-29 20:08:16 24 4
gpt4 key购买 nike

为什么STL排序不适用于map >?

我是不是遗漏了什么,或者我是否需要制作类似比较功能的东西来排序。任何人都可以提供一些想法。

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
int main(){

std::map<int,std::vector<int>> map1;

map1[0].push_back(3);
map1[0].push_back(2);
map1[0].push_back(1);

map1[1].push_back(3);
map1[1].push_back(2);
map1[1].push_back(1);

for(auto i : map1){

std::cout<< i.first << " --> ";

for(auto j : i.second){

std::cout<<j<<" ";
}
std::cout<<"\n";
}

for(auto i : map1){
std::sort(i.second.begin(), i.second.end());
}

std::cout<<"\n";

for(auto i : map1){

std::cout<< i.first << " --> ";

for(auto j : i.second){

std::cout<<j<<" ";
}
std::cout<<"\n";
}

return 0;
}

Output before and after sorting is same.

0 --> 3 2 1

1 --> 3 2 1

最佳答案

当遍历 map1 中的条目时,您复制每个节点。因此,排序是在一个独立的、新创建的 std::vector<int> 实例上执行的。 ,并且在下一次迭代中已经丢失了对该循环本地变量的更改(例如对其进行排序)。

您需要将基于for循环的中心范围更改为

for(auto& i : map1) {
// ^ Loop over references to map nodes, not copies!
std::sort(i.second.begin(), i.second.end());
}

作为旁注,当您可以使用 C++17 时,您可能希望使用结构化绑定(bind)来使循环更具表现力

for(auto& [key, vec] : map1) {
std::sort(vec.begin(), vec.end());
}

关于c++ - 为什么内置排序无法对 vector 映射进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55328022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com