C++ 为什么内置排序无法对向量映射进行排序?

C++ 为什么内置排序无法对向量映射进行排序?,c++,sorting,dictionary,vector,C++,Sorting,Dictionary,Vector,为什么STL排序不适用于map

为什么STL排序不适用于map

我是否遗漏了一些东西,或者我是否需要做一些类似于比较函数的东西来排序。有人能给我一些建议吗

#包括
#包括
#包括
#包括
int main(){
地图地图1;
map1[0]。推回(3);
map1[0]。推回(2);
map1[0]。向后推_(1);
map1[1]。推回(3);
map1[1]。推回(2);
map1[1]。推回(1);
用于(自动i:map1){

std::cout当在
map1
中的条目上循环时,复制每个节点。因此,排序是在新创建的
std::vector
的独立实例上执行的,对循环局部变量的更改(例如排序)在下一次迭代中已经丢失

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

for(auto& i : map1) {
   //   ^ Loop over references to map nodes, not copies!
   std::sort(i.second.begin(), i.second.end());
}
作为旁注,当您可以使用C++17时,您可能希望使用结构化绑定,通过

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

你能更详细地解释一下它是如何工作的以及为什么吗?好吧,原因应该已经在答案中了。使用
for(auto-i:someRange)
,你可以复制范围内的每个项目。这与
for(auto-i:someRange)是不同的
,其中循环每个项目的引用,而不是副本。引用是内存中对象的别名,而副本克隆对象并创建相同的对象。
for(auto& [key, vec] : map1) {
   std::sort(vec.begin(), vec.end());
}