C++ 如何在C+中访问有序映射中的键的范围/间隔+;?

C++ 如何在C+中访问有序映射中的键的范围/间隔+;?,c++,dictionary,C++,Dictionary,我试图编写一个if条件,在该条件下,我希望根据访问映射的哪些元素来执行代码,例如,对于元素26到74只有100个元素的映射。但我不想讨论特定的键,而是地图的某一部分。我是否应该使用[]操作符执行此操作?我试过了 if(map.size()/4 < iterator < map.size()*3/4){} if(map.size()/4

我试图编写一个if条件,在该条件下,我希望根据访问映射的哪些元素来执行代码,例如,对于元素26到74只有100个元素的映射。但我不想讨论特定的键,而是地图的某一部分。我是否应该使用
[]
操作符执行此操作?我试过了

if(map.size()/4 < iterator < map.size()*3/4){}
if(map.size()/4

但这是行不通的

只需将迭代器设置到要检查的范围的开始和结束处即可

auto it = std::next(map.begin(), map.size() / 4);
auto end = std::next(map.begin(), map.size() * 3 / 4);
然后你可以像这样迭代这个范围

for (; it != end; ++it)
{
    // do stuff here
}
如果你想给你一个计数器,你甚至不需要结束迭代器。这节省了在映射中推进末端迭代器的成本,这可能会产生影响,尤其是在较大的映射上。那看起来像

auto it = std::next(map.begin(), map.size() / 4);
auto end = map.size() / 2;
for (size_t counter = 0; counter < end; ++it, ++counter)
{
    // do stuff here
}
autoit=std::next(map.begin(),map.size()/4);
自动结束=map.size()/2;
用于(大小\u t计数器=0;计数器
您无法从
std::map
迭代器有效地获取此信息,因为它们不是随机访问(而是双向访问)。换句话说,给定一个
std::map
迭代器,您只需通过递减/递增它,直到到达开始/结束,就可以知道它前后有多少个条目。如果您对每个条目都这样做(例如,在某些
函数中),则可能会出现性能瓶颈,这在您的情况下是可以接受的,但您应该意识到这一点


如果你能做Nathulver的建议,那很好,但是有些情况下可能不那么容易(例如,不连续的范围)。

我认为值得一提的是,迭代器的创建在地图的大小上是线性的。因此,将
It
从映射大小的一半提升到
end
可能是过早的优化(或者从末尾向后——尽管这会更加对称),但是ymmv。谢谢,这是一个巧妙的想法,使用迭代器。我想定义更多迭代器是处理映射子集的最有效方法?这意味着不是创建多个地图?映射本身是使用指向列表的指针创建的。@fitzy_blarb只要不改变映射(添加或删除元素),我就只处理切片,而不是将其复制到新映射中。复制是昂贵的,如果可以避免的话,就应该避免。