我有一个映射,其中pair用作键,第三个整数用作值。我想知道如何迭代键。示例代码粘贴在下面。
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main ()
{
map <pair<int, int>, int> my_map;
pair <int, int> my_pair;
my_pair = make_pair(1, 2);
my_map[my_pair] = 3;
// My attempt on iteration
for(map<pair<int,int>,int>::iterator it = my_map.begin(); it != my_map.end(); ++it) {
cout << it->first << "\n";
}
return 0;
}
答案 0 :(得分:5)
it->first
是const std::pair<int, int>
类型的对象,它是关键。 it->second
是int
类型的对象,它是映射值。如果您只想输出密钥和映射值,您可以编写
for ( map<pair<int,int>,int>::iterator it = my_map.begin(); it != my_map.end(); ++it )
{
cout << "( " << it->first.first << ", "
<< it->first.second
<< " ): "
<< it->second
<< std::endl;
}
或者您可以使用基于范围的for语句
for ( const auto &p : my_map )
{
cout << "( " << p.first.first << ", "
<< p.first.second
<< " ): "
<< p.second
<< std::endl;
}
答案 1 :(得分:3)
好吧,map Key是第一项,但它本身就是一对
所以
pair<int,int>& key(*it);
cout << key.first << " " << key.second << "\n";
可能会做到这一点
答案 2 :(得分:2)
您是否可以访问c ++ 11,auto关键字可以让它看起来更好。我编译并运行得很好。
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main ()
{
map <pair<int, int>, int> my_map;
pair <int, int> my_pair;
my_pair = make_pair(1, 2);
my_map[my_pair] = 3;
// My attempt on iteration
for(auto it = my_map.begin(); it != my_map.end(); ++it) {
cout << it->first.first << "\n";
}
return 0;
}
答案 3 :(得分:1)
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
int main()
{
map <pair<int, int>, int> my_map;
pair <int, int> my_pair;
my_pair = make_pair(1, 2);
my_map[my_pair] = 3;
// My attempt on iteration
for (map<pair<int, int>, int>::iterator it = my_map.begin(); it != my_map.end(); ++it) {
cout << it->first.first << "\n";
cout << it->first.second << "\n";
}
return 0;
}
答案 4 :(得分:0)
默认情况下,std::ostream
不知道如何处理std::pair
。因此,如果要打印键,最简单的方法是直接访问它们的两个元素,如其他答案所示。但是,如果您有权使用C++11功能,则也可以使用range-based for
loop遍历地图,如下所示:
int main() {
std::map<std::pair<int, int>, int> my_map{ {{1, 2}, 3}, {{4, 5}, 6}, {{7, 8}, 9} };
for (auto const &kv : my_map)
std::cout << "(" << kv.first.first << ", " << kv.first.second << ") = " << kv.second << std::endl;
return 0;
}
输出:
(1,2)= 3
(4,5)= 6
(7,8)= 9
如果可以使用C++17,则可以通过使用structured binding进一步缩短代码
在基于范围的for
循环中,如下所示:
for (auto const &[k, v] : my_map)
std::cout << "(" << k.first << ", " << k.second << ") = " << v << std::endl;