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
将立即失败,循环将永远不会执行?或者我弄错了? (这很重要,因为我在这个例子中有一些代码,而且第二眼看看它可能会行为不端。)
答案 0 :(得分:4)
范围中的第二个迭代器是“一个接一个”的地方,就像mymm.end()
的工作方式一样。如果mymm.begin()
和mymm.end()
相同,则容器中没有任何内容。此处ret.first
和ret.second
相同,表示结果范围中没有元素。由于“d”有一个元素,ret.first
指向该元素,ret.second
与mymm.end()
相同。
答案 1 :(得分:3)
不,没错。根据
来自http://en.cppreference.com/w/cpp/container/multimap/equal_range的返回一个范围,其中包含具有给定键的所有元素 容器。范围由两个迭代器定义,一个指向 第一个元素不小于键,另一个元素指向 第一个元素大于键。
按预期工作。