在没有for循环的情况下,如何直接找到两个迭代器之间指向两个不同键的元素的数量?
#include <string>
#include <iostream>
#include <map>
#include <utility>
#include <iterator>
#include <stdio.h>
using namespace std;
int main()
{
std::map<string, string> m;
m.insert(pair< string, string>("4-2"," 61-7" ));
m.insert(pair< string, string>("5-2"," 61-7" ));
m.insert(pair< string, string>("5-3"," 61-7" ));
m.insert(pair< string, string>("5-4"," 61-7" ));
m.insert(pair< string, string>("5-5"," 61-7" ));
m.insert(pair< string, string>("5-6"," 61-7" ));
map<string, string>::iterator it4;
map<string, string>::iterator it5;
it4=m.find("5-2");
it5=m.find("5-5");
cout << " value of it4" << it4->first << it4->second << endl;
cout << " value of it5" << it5->first << it5->second << endl;
m.clear();
getchar();
}
我想要的输出是it5和it4之间的元素差异,这里是2,因为它们之间有关键字"5-3“和"5-4”。我不想在for循环中迭代,因为在我的例子中,map中的元素数量足够大了。而且我必须经常知道它们之间的区别。如果两个迭代器相距很远,则使用for循环将花费大量时间。
发布于 2012-01-12 02:58:18
您可以从<iterator>
使用std::distance(it4, it5)
。然而,成本在结果中将是线性的,因此这并不能真正节省您的成本。如果您必须快速访问此信息,请考虑使用Boost.Multi_index容器,以便可以将随机访问索引添加到地图中。
发布于 2012-01-12 03:08:25
考虑到你的需求,这是不可能的。std::map
不提供随机访问迭代器,这是在恒定时间内确定迭代器距离所必需的。
您仍然可以使用std::distance
,但成本将与您自己编写循环的成本相同。
如果您需要更有效地生成此信息,则必须用不同的数据结构替换地图(或者至少通过一些额外的记账来增强它)。
唯一具有随机访问迭代器的标准库容器是vector
、deque
和` `array。
https://stackoverflow.com/questions/8824974
复制相似问题