C ++ Primer 5th的第11章(关于关联容器)说:
关联容器不支持顺序容器位置特定的操作,例如push_front或back。因为元素是根据它们的键存储的,所以这些操作对于关联容器来说是没有意义的。
然而,在练习两次练习后,我很困惑:
鉴于map<string, vector<string>>
,系统会要求我们向vector<int>
添加key
,我的(工作)解决方案是:
using Map = map<string, vector<string>>;
Map my_map;
for(string ln; cin >> ln)
for(string cn; cin >> cn)
my_map[ln].push_back(cn);
但是在第二个练习中,假设c是多字符串的字符串而v是字符串的向量,copy(v.begin(), v.end(), back_inserter(c));
合法还是非法?
当我使用它时,我收到了这个错误:
错误:&#39; class std :: multiset&gt;&#39;没有名为&#39; push_back&#39;`
的成员
我所知道的是back_inserter
没有工作,因为没有push_back
。
答案 0 :(得分:3)
my_map[ln].push_back(cn)
未在push_back
(map
)上致电my_map
,而是在push_back
map
上致电mapped_type
} vector<string>
- 您可以使用operator[]
(my_map[ln]
)访问此内容。
您的陈述my_map[ln].push_back(cn)
基本上等同于:
vector<string>& v = my_map[ln];
v.push_back(cn);
答案 1 :(得分:1)
您不在地图上使用push_back
。您正在地图中包含的字符串向量上使用它。
back_inserter
在内部使用push_back
,关联容器缺少此类方法,因此无法使用它。
答案 2 :(得分:1)
您可以使用std::inserter
代替std::multiset::insert
std::vector<std::string> v {"aaa", "bbbb", "ccc"};
std::multiset<std::string> m;
std::copy(v.begin(), v.end(), std::inserter(m, m.end()));
for (const auto & x : m)
std::cout << x << "\n";
答案 3 :(得分:0)
您的解决方案不会push_back
到关联容器,而是存储在其中的向量。这有点不同。
正如引言所说,multiset
没有顺序push_back
方法,因此您无法使用std::copy(...,...,std::back_inserter(..))
。