如何打印包含整数和整数集的std::映射

How do I print std::maps that contains integers and sets of integers?

本文关键字:整数 std 映射 包含 何打印 打印      更新时间:2023-10-16

我有一个映射,它包含整数作为引用整数集的键。基本上我有一个std::map(int,std::set(int))。

我试图为映射定义一个迭代器,为集合定义一个,但当我试图将set_iterator指向映射中的特定集合时,我总是遇到错误。我在试图使两个迭代器相等的相等符号下得到了一条红线(没有运算符"="与这些操作数匹配)。我使用的是visualstudio c++2017,并且我不断收到构建错误。

/mykarger.cpp 的63-70行

map<int, std::set<int>>::iterator graph_it;
set<string>::const_iterator set_it, set_end;
std::cout << "VertixtEdgesn;";
for(graph_it = mygraph.begin(); graph_it != mygraph.end(); ++graph_it) {
std::cout << graph_it->first << ":t";
for(set_it = graph_it->second.begin();; set_it != graph_it->second.end(); ++set_it){
cout << *set_it << "t";

}

我希望结果打印成这样:

Vertex       Edges
1:           2      3
2:           1      3
3:           1      2

但我得到了错误:

1>------ Build started: Project: mykarger, Configuration: Debug Win32 ------
1>mykarger.cpp
1>c:usersalkamalisourcereposmykargermykargermykarger.cpp(68): error C2679: binary '=': no operator found which takes a right-hand operand of type 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> *' (or there is no acceptable conversion)
1>        with
1>        [
1>            _Ty=int
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includextree(303): note: could be 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>::operator =(std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &&)'
1>        with
1>        [
1>            _Ty=std::basic_string<char,std::char_traits<char>,std::allocator<char>>
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includextree(303): note: or       'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>::operator =(const std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &)'
1>        with
1>        [
1>            _Ty=std::basic_string<char,std::char_traits<char>,std::allocator<char>>
1>        ]
1>c:usersalkamalisourcereposmykargermykargermykarger.cpp(68): note: while trying to match the argument list '(std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>, std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> *)'
1>        with
1>        [
1>            _Ty=std::basic_string<char,std::char_traits<char>,std::allocator<char>>
1>        ]
1>        and
1>        [
1>            _Ty=int
1>        ]
1>c:usersalkamalisourcereposmykargermykargermykarger.cpp(69): error C2679: binary '=': no operator found which takes a right-hand operand of type 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> *' (or there is no acceptable conversion)
1>        with
1>        [
1>            _Ty=int
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includextree(303): note: could be 'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>::operator =(std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &&)'
1>        with
1>        [
1>            _Ty=std::basic_string<char,std::char_traits<char>,std::allocator<char>>
1>        ]
1>c:program files (x86)microsoft visual studio2017communityvctoolsmsvc14.16.27023includextree(303): note: or       'std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>::operator =(const std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> &)'
1>        with
1>        [
1>            _Ty=std::basic_string<char,std::char_traits<char>,std::allocator<char>>
1>        ]
1>c:usersalkamalisourcereposmykargermykargermykarger.cpp(69): note: while trying to match the argument list '(std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>>, std::_Tree_const_iterator<std::_Tree_val<std::_Tree_simple_types<_Ty>>> *)'
1>        with
1>        [
1>            _Ty=std::basic_string<char,std::char_traits<char>,std::allocator<char>>
1>        ]
1>        and
1>        [
1>            _Ty=int
1>        ]
1>Done building project "mykarger.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

错误消息是巨大的,提取相关信息可能需要一段时间,但归根结底是您试图将std::set<int>::iterator分配给std::set<string>::iterator

你有

map<int, std::set<int>>::iterator graph_it;
^^^

但是

set<string>::const_iterator set_it, set_end;
^^^^^^

同一循环的更现代的公式避免了许多潜在的问题:

for(const auto& vertex: my_graph) {
std::cout << vertex.first << ":t";
for (const auto& edge: vertex.second)
{
std::cout << edge << " ";
}
}