STL 无序映射 - 插入向量
STL Unordered Map- inserting into a vector
我对 STL 的无序映射不太熟悉,我在向其中插入元素时遇到问题。
所以我有一个无序映射,其中键是一个字符串,映射值是一个整数向量。我将其声明为:
unordered_map<string, vector<int> > categorySearch;
我将如何向这张地图中插入元素。我目前正在做
categorySearch.insert(make_pair("hello", categorySearch["hello"].push_back(5)));
这显然给我编译器错误。如何对地图的矢量部分使用插入。
这是我得到的编译器错误:
logData.h: In member function ‘void LogData::addEntry(Log)’:
logData.h:23:68: error: no match for ‘operator[]’ (operand types are ‘std::unordered_map<std::basic_string<char>, std::vector<int> >’ and ‘<unresolved overloaded function type>’)
categorySearch.insert(make_pair(add.getCategory(), categorySearch[add.getCategory].push_back(data.size()-1)));
^
logData.h:23:68: note: candidates are:
In file included from /usr/um/gcc-4.8.2/include/c++/4.8.2/unordered_map:48:0,
from logData.h:2,
from logman.cpp:5:
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:595:7: note: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type&) [with _Key = std::basic_string<char>; _Tp = std::vector<int>; _Hash = std::hash<std::basic_string<char> >; _Pred = std::equal_to<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<int> > >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = std::vector<int>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::basic_string<char>]
operator[](const key_type& __k)
^
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:595:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘const key_type& {aka const std::basic_string<char>&}’
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:599:7: note: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type&&) [with _Key = std::basic_string<char>; _Tp = std::vector<int>; _Hash = std::hash<std::basic_string<char> >; _Pred = std::equal_to<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<int> > >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = std::vector<int>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::basic_string<char>]
operator[](key_type&& __k)
^
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:599:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::unordered_map<std::basic_string<char>, std::vector<int> >::key_type&& {aka std::basic_string<char>&&}’
make: *** [logman.o] Error 1
谢谢。
pair 中的 second
是一个 vector<int>
,因此您构造一个向量,其中 1 个元素用 5 初始化,而不是 push_back
。
categorySearch.insert(make_pair("hello", std::vector<int>(1,5)));
如果该项已经存在,使用unordered_map::insert
给你的return值,它是一个std::pair
,由迭代器和一个表示成功的bool
组成插入次数:
#include <vector>
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
typedef unordered_map<string, vector<int>> CMap;
CMap category_map;
category_map.insert(make_pair("hello", std::vector<int>(1, 5)));
auto pr = category_map.insert(make_pair("hello", std::vector<int>(1, 5)));
if (!pr.second)
pr.first->second.push_back(10);
cout << pr.first->second.size();
}
您将看到 "hello" 的地图条目现在在向量中有 2 个项目,因为第二次调用 insert
由于项目先前存在而失败。
看这里:http://en.cppreference.com/w/cpp/container/unordered_map/insert
我想我会采用两种方法之一。第一种可能是使用地图的 operator[]
,因此代码如下所示:
category_search["hello"].push_back(5);
另一种明显的可能性是认识到您正在创建的内容(每个键都有多个映射值)等同于 unordered_multimap
提供的内容,因此您可以只使用:
std::unordered_multimap<std::string, int> category_search;
category_search.emplace("hello", 5);
请注意,我还使用了 emplace
来简化代码(作为奖励,可能 运行 也快了一点)。
是的,这两个都支持多个值,因此您可以添加:
category_search["hello"].push_back(10);
... 或:
category_search.emplace("hello", 10);
...分别到 unordered_map
/unordered_multimap
也将值 10
与键 hello
.
相关联
在 unordered_multimap
的情况下,您将使用 equal_range
检索与特定键关联的值集,例如:
auto p = category_search.equal_range("hello");
这会将范围的开始放在 p.first
中,结束放在 p.second
中。
我对 STL 的无序映射不太熟悉,我在向其中插入元素时遇到问题。
所以我有一个无序映射,其中键是一个字符串,映射值是一个整数向量。我将其声明为:
unordered_map<string, vector<int> > categorySearch;
我将如何向这张地图中插入元素。我目前正在做
categorySearch.insert(make_pair("hello", categorySearch["hello"].push_back(5)));
这显然给我编译器错误。如何对地图的矢量部分使用插入。
这是我得到的编译器错误:
logData.h: In member function ‘void LogData::addEntry(Log)’:
logData.h:23:68: error: no match for ‘operator[]’ (operand types are ‘std::unordered_map<std::basic_string<char>, std::vector<int> >’ and ‘<unresolved overloaded function type>’)
categorySearch.insert(make_pair(add.getCategory(), categorySearch[add.getCategory].push_back(data.size()-1)));
^
logData.h:23:68: note: candidates are:
In file included from /usr/um/gcc-4.8.2/include/c++/4.8.2/unordered_map:48:0,
from logData.h:2,
from logman.cpp:5:
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:595:7: note: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type&) [with _Key = std::basic_string<char>; _Tp = std::vector<int>; _Hash = std::hash<std::basic_string<char> >; _Pred = std::equal_to<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<int> > >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = std::vector<int>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::basic_string<char>]
operator[](const key_type& __k)
^
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:595:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘const key_type& {aka const std::basic_string<char>&}’
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:599:7: note: std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type&&) [with _Key = std::basic_string<char>; _Tp = std::vector<int>; _Hash = std::hash<std::basic_string<char> >; _Pred = std::equal_to<std::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::vector<int> > >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = std::vector<int>; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::basic_string<char>]
operator[](key_type&& __k)
^
/usr/um/gcc-4.8.2/include/c++/4.8.2/bits/unordered_map.h:599:7: note: no known conversion for argument 1 from ‘<unresolved overloaded function type>’ to ‘std::unordered_map<std::basic_string<char>, std::vector<int> >::key_type&& {aka std::basic_string<char>&&}’
make: *** [logman.o] Error 1
谢谢。
pair 中的 second
是一个 vector<int>
,因此您构造一个向量,其中 1 个元素用 5 初始化,而不是 push_back
。
categorySearch.insert(make_pair("hello", std::vector<int>(1,5)));
如果该项已经存在,使用unordered_map::insert
给你的return值,它是一个std::pair
,由迭代器和一个表示成功的bool
组成插入次数:
#include <vector>
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
typedef unordered_map<string, vector<int>> CMap;
CMap category_map;
category_map.insert(make_pair("hello", std::vector<int>(1, 5)));
auto pr = category_map.insert(make_pair("hello", std::vector<int>(1, 5)));
if (!pr.second)
pr.first->second.push_back(10);
cout << pr.first->second.size();
}
您将看到 "hello" 的地图条目现在在向量中有 2 个项目,因为第二次调用 insert
由于项目先前存在而失败。
看这里:http://en.cppreference.com/w/cpp/container/unordered_map/insert
我想我会采用两种方法之一。第一种可能是使用地图的 operator[]
,因此代码如下所示:
category_search["hello"].push_back(5);
另一种明显的可能性是认识到您正在创建的内容(每个键都有多个映射值)等同于 unordered_multimap
提供的内容,因此您可以只使用:
std::unordered_multimap<std::string, int> category_search;
category_search.emplace("hello", 5);
请注意,我还使用了 emplace
来简化代码(作为奖励,可能 运行 也快了一点)。
是的,这两个都支持多个值,因此您可以添加:
category_search["hello"].push_back(10);
... 或:
category_search.emplace("hello", 10);
...分别到 unordered_map
/unordered_multimap
也将值 10
与键 hello
.
在 unordered_multimap
的情况下,您将使用 equal_range
检索与特定键关联的值集,例如:
auto p = category_search.equal_range("hello");
这会将范围的开始放在 p.first
中,结束放在 p.second
中。