无法插入标准映射
Unable to insert to std map
我有一个由 int 和指向结构的指针组成的 std 映射。但是使用插入功能我无法添加相同的内容。错误信息似乎有点棘手,我无法深入了解。
#include <iostream>
#include <map>
using namespace std;
typedef struct
{
}NODE;
int main()
{
std::map<int, NODE*> mp;
int i = 0;
mp.insert(i, new NODE());
return 0;
}
错误语言有点含糊。我正在尝试将一个 int 和一个 NODE 指针添加到 int 和 NODE 指针的映射。为什么这给我不匹配的功能?
main.cpp: In function ‘int main()’:
main.cpp:22:28: error: no matching function for call to ‘std::map::insert(int&, NODE*)’
mp.insert(i, new NODE());
^
In file included from /usr/include/c++/7/map:61:0,
from main.cpp:10:
/usr/include/c++/7/bits/stl_map.h:621:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::insert_return_type std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::node_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::insert_return_type = std::_Node_insert_return >, std::_Node_handle, std::allocator > > > >; std::map<_Key, _Tp, _Compare, _Alloc>::node_type = std::_Node_handle, std::allocator > > >]
insert(node_type&& __nh)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:621:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:626:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, std::map<_Key, _Tp, _Compare, _Alloc>::node_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::node_type = std::_Node_handle, std::allocator > > >]
insert(const_iterator __hint, node_type&& __nh)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:626:7: note: no known conversion for argument 1 from ‘int’ to ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
/usr/include/c++/7/bits/stl_map.h:795:7: note: candidate: std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const value_type&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; typename std::_Rb_tree<_Key, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(const value_type& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:795:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:802:7: note: candidate: std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::value_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; typename std::_Rb_tree<_Key, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(value_type&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:802:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:808:2: note: candidate: template std::__enable_if_t, _Pair>::value, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> > std::map<_Key, _Tp, _Compare, _Alloc>::insert(_Pair&&) [with _Pair = _Pair; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(_Pair&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:808:2: note: template argument deduction/substitution failed:
main.cpp:22:28: note: candidate expects 1 argument, 2 provided
mp.insert(i, new NODE());
^
In file included from /usr/include/c++/7/map:61:0,
from main.cpp:10:
/usr/include/c++/7/bits/stl_map.h:822:7: note: candidate: void std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::initializer_list >) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(std::initializer_list<value_type> __list)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:822:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:852:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, const value_type&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(const_iterator __position, const value_type& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:852:7: note: no known conversion for argument 1 from ‘int’ to ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
/usr/include/c++/7/bits/stl_map.h:862:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, std::map<_Key, _Tp, _Compare, _Alloc>::value_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(const_iterator __position, value_type&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:862:7: note: no known conversion for argument 1 from ‘int’ to ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
/usr/include/c++/7/bits/stl_map.h:867:2: note: candidate: template std::__enable_if_t, _Pair>::value, typename std::_Rb_tree<_Key, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator> std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, _Pair&&) [with _Pair = _Pair; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(const_iterator __position, _Pair&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:867:2: note: template argument deduction/substitution failed:
main.cpp:22:28: note: cannot convert ‘i’ (type ‘int’) to type ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
mp.insert(i, new NODE());
^
In file included from /usr/include/c++/7/map:61:0,
from main.cpp:10:
/usr/include/c++/7/bits/stl_map.h:885:2: note: candidate: template void std::map<_Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _InputIterator = _InputIterator; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(_InputIterator __first, _InputIterator __last)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:885:2: note: template argument deduction/substitution failed:
main.cpp:22:28: note: deduced conflicting types for parameter ‘_InputIterator’ (‘int’ and ‘NODE*’)
mp.insert(i, new NODE());
当你想将它插入到地图中时,你必须像这样将其插入为std::pair
:
mp.insert(std::pair<int, NODE*>(i, new NODE()));
啊好的。
所以插入函数需要一对。
/usr/include/c++/7/bits/stl_map.h:802:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:808:2: note: candidate: template std::__enable_if_t, _Pair>::value, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> > std::map<_Key, _Tp, _Compare, _Alloc>::insert(_Pair&&) [with _Pair = _Pair; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(_Pair&& __x)
感谢以上建议。
mp.insert(std::make_pair(i, p));
如果您使用的是 C++11 或更高版本(默认情况下,最近的编译器就是这种情况),那么您可以改用 map::emplace
方法。使用 emplace,您可以简单地传递构成对的两个部分的两个参数,如下所示:
#include <iostream>
#include <string>
#include <map>
int main() {
std::map<int, std::string> m;
m.emplace(123, "ddd");
for (const auto &p : m) {
std::cout << p.first << " => " << p.second << '\n';
}
}
看到这个running on Godbolt。
备注:
- 我在示例中将
NODE
替换为 std::string
,以便您可以看到它正在打印。
- 如果您使用的是 C++17 或更高版本,您可能更喜欢
map::try_emplace()
。
如果要在 std::map
中插入元素,可以使用方法 emplace
( https://www.cplusplus.com/reference/map/map/emplace/ ) 将 std::make_pair
构造函数参数直接传递给它。
#include <iostream>
#include <map>
using namespace std;
typedef struct
{
}NODE;
int main()
{
std::map<int, NODE*> mp;
int i = 0;
mp.emplace(i, new NODE());
return 0;
}
我有一个由 int 和指向结构的指针组成的 std 映射。但是使用插入功能我无法添加相同的内容。错误信息似乎有点棘手,我无法深入了解。
#include <iostream>
#include <map>
using namespace std;
typedef struct
{
}NODE;
int main()
{
std::map<int, NODE*> mp;
int i = 0;
mp.insert(i, new NODE());
return 0;
}
错误语言有点含糊。我正在尝试将一个 int 和一个 NODE 指针添加到 int 和 NODE 指针的映射。为什么这给我不匹配的功能?
main.cpp: In function ‘int main()’:
main.cpp:22:28: error: no matching function for call to ‘std::map::insert(int&, NODE*)’
mp.insert(i, new NODE());
^
In file included from /usr/include/c++/7/map:61:0,
from main.cpp:10:
/usr/include/c++/7/bits/stl_map.h:621:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::insert_return_type std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::node_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::insert_return_type = std::_Node_insert_return >, std::_Node_handle, std::allocator > > > >; std::map<_Key, _Tp, _Compare, _Alloc>::node_type = std::_Node_handle, std::allocator > > >]
insert(node_type&& __nh)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:621:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:626:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, std::map<_Key, _Tp, _Compare, _Alloc>::node_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::node_type = std::_Node_handle, std::allocator > > >]
insert(const_iterator __hint, node_type&& __nh)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:626:7: note: no known conversion for argument 1 from ‘int’ to ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
/usr/include/c++/7/bits/stl_map.h:795:7: note: candidate: std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const value_type&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; typename std::_Rb_tree<_Key, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(const value_type& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:795:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:802:7: note: candidate: std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::value_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; typename std::_Rb_tree<_Key, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(value_type&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:802:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:808:2: note: candidate: template std::__enable_if_t, _Pair>::value, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> > std::map<_Key, _Tp, _Compare, _Alloc>::insert(_Pair&&) [with _Pair = _Pair; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(_Pair&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:808:2: note: template argument deduction/substitution failed:
main.cpp:22:28: note: candidate expects 1 argument, 2 provided
mp.insert(i, new NODE());
^
In file included from /usr/include/c++/7/map:61:0,
from main.cpp:10:
/usr/include/c++/7/bits/stl_map.h:822:7: note: candidate: void std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::initializer_list >) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(std::initializer_list<value_type> __list)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:822:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:852:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, const value_type&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(const_iterator __position, const value_type& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:852:7: note: no known conversion for argument 1 from ‘int’ to ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
/usr/include/c++/7/bits/stl_map.h:862:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, std::map<_Key, _Tp, _Compare, _Alloc>::value_type&&) [with _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >; std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator = std::_Rb_tree_const_iterator >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair]
insert(const_iterator __position, value_type&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:862:7: note: no known conversion for argument 1 from ‘int’ to ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
/usr/include/c++/7/bits/stl_map.h:867:2: note: candidate: template std::__enable_if_t, _Pair>::value, typename std::_Rb_tree<_Key, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator> std::map<_Key, _Tp, _Compare, _Alloc>::insert(std::map<_Key, _Tp, _Compare, _Alloc>::const_iterator, _Pair&&) [with _Pair = _Pair; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(const_iterator __position, _Pair&& __x)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:867:2: note: template argument deduction/substitution failed:
main.cpp:22:28: note: cannot convert ‘i’ (type ‘int’) to type ‘std::map::const_iterator {aka std::_Rb_tree_const_iterator >}’
mp.insert(i, new NODE());
^
In file included from /usr/include/c++/7/map:61:0,
from main.cpp:10:
/usr/include/c++/7/bits/stl_map.h:885:2: note: candidate: template void std::map<_Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _InputIterator = _InputIterator; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(_InputIterator __first, _InputIterator __last)
^~~~~~
/usr/include/c++/7/bits/stl_map.h:885:2: note: template argument deduction/substitution failed:
main.cpp:22:28: note: deduced conflicting types for parameter ‘_InputIterator’ (‘int’ and ‘NODE*’)
mp.insert(i, new NODE());
当你想将它插入到地图中时,你必须像这样将其插入为std::pair
:
mp.insert(std::pair<int, NODE*>(i, new NODE()));
啊好的。
所以插入函数需要一对。
/usr/include/c++/7/bits/stl_map.h:802:7: note: candidate expects 1 argument, 2 provided
/usr/include/c++/7/bits/stl_map.h:808:2: note: candidate: template std::__enable_if_t, _Pair>::value, std::pair, std::_Select1st >, _Compare, typename __gnu_cxx::__alloc_traits<_Alloc>::rebind >::other>::iterator, bool> > std::map<_Key, _Tp, _Compare, _Alloc>::insert(_Pair&&) [with _Pair = _Pair; _Key = int; _Tp = NODE*; _Compare = std::less; _Alloc = std::allocator >]
insert(_Pair&& __x)
感谢以上建议。
mp.insert(std::make_pair(i, p));
如果您使用的是 C++11 或更高版本(默认情况下,最近的编译器就是这种情况),那么您可以改用 map::emplace
方法。使用 emplace,您可以简单地传递构成对的两个部分的两个参数,如下所示:
#include <iostream>
#include <string>
#include <map>
int main() {
std::map<int, std::string> m;
m.emplace(123, "ddd");
for (const auto &p : m) {
std::cout << p.first << " => " << p.second << '\n';
}
}
看到这个running on Godbolt。
备注:
- 我在示例中将
NODE
替换为std::string
,以便您可以看到它正在打印。 - 如果您使用的是 C++17 或更高版本,您可能更喜欢
map::try_emplace()
。
如果要在 std::map
中插入元素,可以使用方法 emplace
( https://www.cplusplus.com/reference/map/map/emplace/ ) 将 std::make_pair
构造函数参数直接传递给它。
#include <iostream>
#include <map>
using namespace std;
typedef struct
{
}NODE;
int main()
{
std::map<int, NODE*> mp;
int i = 0;
mp.emplace(i, new NODE());
return 0;
}