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

时间:2018-10-10 14:56:20

标签: c++ dictionary

我正在尝试编写一个if条件,在该条件下我想根据访问映射的哪些元素来执行代码,例如对于仅包含元素26到74的100个元素的映射。但是我不想解决特定的键,而是要解决映射的特定部分。我应该使用[]运算符来执行此操作吗?我尝试过

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

但这不起作用。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您无法从std::map迭代器中有效地获取此信息,因为它们不是随机访问(而是双向访问)。换句话说,给定一个std::map迭代器,您仅需对它进行递减/递增,直到到达开始/结束位置,就可以找出它之前和之后的条目数。如果您对每个条目都执行此操作(例如在某些<algorithm>函数中),则存在性能瓶颈的风险-在您的情况下这是可以接受的,但您应该意识到这一点。

如果您可以按照NathanOliver的建议进行操作,那很好,但是在某些情况下,它可能不那么容易(例如,非连续范围)。