我已经得到了这段代码,但我无法理解 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;
}
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
该对中的迭代器定义了键等于您以
[range.first, range.second)
方式搜索的项目的范围。
这意味着要在该范围内进行迭代,您需要从
range.first
开始并推进迭代器直到达到 range.second
,这意味着您刚刚走出了相同的范围。从概念上讲,这与迭代某个范围时发生的情况相同[container.begin(), container.end())
。
equal_range
返回一对迭代器 i1, i2
,使得 [i1, i2)
范围内的所有元素都具有相同的键。因此,为了迭代代码为 718 的所有城市,您可以调用 equal_range
,然后从返回的对的 first
迭代到返回的对的 second
。
仅当 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";