gpt4 book ai didi

c++ - 如何遍历/迭代 STL 映射?

转载 作者:IT老高 更新时间:2023-10-28 12:35:25 26 4
gpt4 key购买 nike

我想遍历一个 STL 映射。我不想使用它的 key 。我不关心排序,我只是寻找一种访问它包含的所有元素的方法。我该怎么做?

最佳答案

是的,您可以遍历标准库map。这是用于遍历 map 的基本方法,可作为遍历任何标准库集合的指南:

C++03/C++11:

#include <cstdlib>
#include <map>
#include <string>
using namespace std;

int main()
{
typedef map<int,string> MyMap;
MyMap my_map;
// ... magic

for( MyMap::const_iterator it = my_map.begin(); it != my_map.end(); ++it )
{
int key = it->first;
string value = it->second;
}
}

如果需要修改元素:

  • 使用 iterator 而不是 const_iterator
  • 不是从迭代器中复制值,而是获取引用并通过它修改值。

    for(MyMap::iterator it = my_map.begin(); it != my_map.end();++it){ int key = it->first; 字符串&值=它->秒; 如果(值(value)==“富”) 值(value)=“酒吧”;}

这就是您通常手动遍历标准库容器的方式。最大的区别在于,对于 map*it 的类型是 pair 而不是元素本身

C++11

如果您受益于 C++11 编译器(例如,带有 --std=c++11 的最新 GCC 或 MSVC),那么您还有其他选择。

首先,您可以使用 auto 关键字来摆脱所有令人讨厌的冗长:

#include <cstdlib>
#include <map>
#include <string>
using namespace std;

int main()
{
map<int,string> my_map;
// ... magic

for( auto it = my_map.begin(); it != my_map.end(); ++it )
{
int key = it->first;
string& value = it->second;
}
}

其次,您还可以使用 lambda。与 decltype 结合使用,可能会产生更简洁的代码(尽管需要权衡):

#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
map<int,string> my_map;
// ... magic

for_each(my_map.begin(), my_map.end(), [](decltype(*my_map.begin()) val)
{
string& value = val.second;
int key = val.first;
});
}

C++11 还引入了基于范围的 for 循环的概念,您可能会认为它与其他语言类似。然而,一些编译器还不完全支持这一点——尤其是 MSVC。

#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
map<int,string> my_map;
// ... magic

for(auto val : my_map )
{
string& value = val.second;
int key = val.first;
}
}

关于c++ - 如何遍历/迭代 STL 映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207346/

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