C++:STL multimap.equal_range()

问题描述 投票:0回答:4

我已经得到了这段代码,但我无法理解 equal_range 方法返回迭代器的部分。 我知道范围是 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;
}
c++ stl multimap
4个回答
33
投票

equal_range
的结果,即您的
range
对象,是两个迭代器[beginning-of-range, end-of-range)
。所以你想迭代
[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
投票

该对中的迭代器定义了键等于您以

[range.first, range.second)
方式搜索的项目的范围。

这意味着要在该范围内进行迭代,您需要从

range.first
开始并推进迭代器直到达到
range.second
,这意味着您刚刚走出了相同的范围。从概念上讲,这与迭代某个范围时发生的情况相同
[container.begin(), container.end())


4
投票

equal_range
返回一对迭代器
i1, i2
,使得
[i1, i2)
范围内的所有元素都具有相同的键。因此,为了迭代代码为 718 的所有城市,您可以调用
equal_range
,然后从返回的对的
first
迭代到返回的对的
second


0
投票

仅当 equal_range 中提供的键不可用时,For 循环条件才会失败。 ->在下面的场景中,it.first 将具有 (2,20),it.second 也将具有 (2,20)。 -> 如果是 mp.equal_range(2)->it.first 将有 (2,20) 并且 it.second 也将有 (3,20)。

多重地图米; m.插入({ 2, 20 }); m.插入({ 3, 20 }); m.插入({ 4, 20 }); 自动它 = mp.equal_range(1); for (auto itr = it.first; itr != it.second; ++itr) { //输出 } 计算<< "Out";

© www.soinside.com 2019 - 2024. All rights reserved.