我正在尝试编写一个if条件,在该条件下我想根据访问映射的哪些元素来执行代码,例如对于仅包含元素26到74的100个元素的映射。但是我不想解决特定的键,而是要解决映射的特定部分。我应该使用[]
运算符来执行此操作吗?我尝试过
if(map.size()/4 < iterator < map.size()*3/4){}
但这不起作用。
答案 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的建议进行操作,那很好,但是在某些情况下,它可能不那么容易(例如,非连续范围)。