C++: STL multimap.equal_range()

14

我有这段代码,但不理解其中的 equal_range 方法返回迭代器的部分。 我知道 range 是一个包含两个 multimap 对象的pair对象,但我不明白为什么会有 'for (it = range.first; it != range.second; ++it)' - 这意味着什么?

// multmap.cpp -- use a multimap
#include <iostream>
#include <string>
#include <map>
#include <algorithm>

typedef int KeyType;
typedef std::pair<const KeyType, std::string> Pair;
typedef std::multimap<KeyType, std::string> MapCode;

int main()
{
using namespace std;
MapCode codes;
codes.insert(Pair(415, "San Francisco"));
codes.insert(Pair(510, "Oakland"));
codes.insert(Pair(718, "Brooklyn"));
 codes.insert(Pair(718, "Staten Island"));
  codes.insert(Pair(415, "San Rafael"));
  codes.insert(Pair(510, "Berkeley"));

  cout << "Number of cities with area code 415: "
    << codes.count(415) << endl;
  cout << "Number of cities with area code 718: "
    << codes.count(718) << endl;
  cout << "Number of cities with area code 510: "
    << codes.count(510) << endl;
  cout << "Area Code City\n";

  MapCode::iterator it;
  for (it = codes.begin(); it != codes.end(); ++it)
  cout << " " << (*it).first << " "
  << (*it).second << endl;

  pair<MapCode::iterator, MapCode::iterator> range
        = codes.equal_range(718);

  cout << "Cities with area code 718:\n";
  for (it = range.first; it != range.second; ++it) //<------------------ here
  cout << (*it).second << endl;
    return 0;
}
3个回答

32
< p >函数< code >equal_range返回你的< code >range对象,它是一个由两个迭代器< code >[range开始,range结尾)表示的< em >对。因此,你想要遍历< code >[range.first, range.second):
auto range = m.equal_range(4);

+---+---+---+---+---+---+---+---+---+
| 2 | 3 | 3 | 4 | 4 | 4 | 4 | 5 | 6 |    =:   m
+---+---+---+---+---+---+---+---+---+
            ^               ^
            |               |
       range.first    range.second

14

pair中的迭代器定义了与所搜索的键相等的项目范围,方式为 [range.first,range.second)

这意味着要遍历该范围,您需要从range.first开始并推进迭代器,直到它达到range.second,这意味着您刚刚跨越了相等范围。在概念上,这与遍历范围[container.begin(),container.end())时发生的情况相同。


我认为你的回答对我来说是最易懂的,因为迭代对pair对象成员进行操作很令人困惑。但如果它与 [container.begin(), container.end()) 相同 那就没问题了。谢谢 - ashur

4
equal_range 返回一对迭代器 i1, i2,使得范围 [i1, i2) 内的所有元素具有相同的键。因此,为了迭代所有代码为 718 的城市,您需要调用 equal_range,然后从返回的一对迭代器中的 first 开始遍历,直到 second

简短而精炼的翻译:简洁明了 - Rajesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接