为什么我可以在map中使用push_back而不在set中使用back_inserter?

时间:2016-01-05 11:24:45

标签: c++

C ++ Primer 5th的第11章(关于关联容器)说:

  

关联容器不支持顺序容器位置特定的操作,例如push_front或back。因为元素是根据它们的键存储的,所以这些操作对于关联容器来说是没有意义的。

然而,在练习两次练习后,我很困惑:

  1. 鉴于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);
    
  2. 但是在第二个练习中,假设c是多字符串的字符串而v是字符串的向量,copy(v.begin(), v.end(), back_inserter(c));合法还是非法?

  3. 当我使用它时,我收到了这个错误:

      

    错误:&#39; class std :: multiset&gt;&#39;没有名为&#39; push_back&#39;`

    的成员

    我所知道的是back_inserter没有工作,因为没有push_back

4 个答案:

答案 0 :(得分:3)

my_map[ln].push_back(cn)未在push_backmap)上致电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";

Live on coliru

答案 3 :(得分:0)

您的解决方案不会push_back到关联容器,而是存储在其中的向量。这有点不同。

正如引言所说,multiset没有顺序push_back方法,因此您无法使用std::copy(...,...,std::back_inserter(..))