C ++中的multimap equal_range

时间:2014-06-26 20:50:45

标签: c++ multimap

cplusplus.com网站上提供了使用equal_range的示例:

 int main ()
 {
   std::multimap<char,int> mymm;

   mymm.insert(std::pair<char,int>('a',10));
   mymm.insert(std::pair<char,int>('b',20));
   mymm.insert(std::pair<char,int>('b',30));
   mymm.insert(std::pair<char,int>('b',40));
   mymm.insert(std::pair<char,int>('c',50));
   mymm.insert(std::pair<char,int>('c',60));
   mymm.insert(std::pair<char,int>('d',60));

   std::cout << "mymm contains:\n";
   for (char ch='a'; ch<='d'; ch++)
   {
      std::pair <std::multimap<char,int>::iterator, std::multimap<char,int>::iterator> ret;
      ret = mymm.equal_range(ch);
      std::cout << ch << " =>";
      for (std::multimap<char,int>::iterator it=ret.first; it!=ret.second; ++it)
         std::cout << ' ' << it->second;
      std::cout << '\n';
   }

输出据说是:

mymm contains:
a => 10
b => 20 30 40
c => 50 60
d => 60

但这不是错的吗?对于&#39; d&#39;例如,条件it!=ret.second将立即失败,循环将永远不会执行?或者我弄错了? (这很重要,因为我在这个例子中有一些代码,而且第二眼看看它可能会行为不端。)

2 个答案:

答案 0 :(得分:4)

范围中的第二个迭代器是“一个接一个”的地方,就像mymm.end()的工作方式一样。如果mymm.begin()mymm.end()相同,则容器中没有任何内容。此处ret.firstret.second相同,表示结果范围中没有元素。由于“d”有一个元素,ret.first指向该元素,ret.secondmymm.end()相同。

答案 1 :(得分:3)

不,没错。根据

  

返回一个范围,其中包含具有给定键的所有元素   容器。范围由两个迭代器定义,一个指向   第一个元素不小于键,另一个元素指向   第一个元素大于键。

来自http://en.cppreference.com/w/cpp/container/multimap/equal_range

按预期工作。