C++ 在c+;中使用映射时,如何在指定范围内使用for循环+;

C++ 在c+;中使用映射时,如何在指定范围内使用for循环+;,c++,C++,我想在使用映射时将用于带迭代器的循环,并希望在指定范围内运行它,而不是从begin()endend()。我想用它的范围像从第三个元素到第五个元素 我想用它的范围像从第三元素到第五元素 元素 由于std::map的迭代器不是RandomAccessIterator,而只是BidirectionalIterator(您无法编写.begin()+3),因此可以使用std::next: for (auto it = std::next(m.begin(), 2); it != std::next(m.b

我想在使用映射时将
用于带迭代器的
循环,并希望在指定范围内运行它,而不是从
begin()
end
end()
。我想用它的范围像从第三个元素到第五个元素

我想用它的范围像从第三元素到第五元素 元素

由于
std::map
的迭代器不是
RandomAccessIterator
,而只是
BidirectionalIterator
(您无法编写
.begin()+3
),因此可以使用
std::next

for (auto it = std::next(m.begin(), 2); it != std::next(m.begin(), 5); ++it)
{
  // ...
}


请记住-检查您的范围以确保您在有效范围内进行迭代。

此代码对于极端情况应该是非常优化和安全的:

int count = 0;
for( auto it = m.begin(); it != m.end(); ++it ) {
    if( ++count <= 3 ) continue;
    if( count > 5 ) break;
    // use iterator
}
int count=0;
对于(自动it=m.begin();it!=m.end();+it){
如果(++计数5)中断;
//使用迭代器
}

但是,以这种方式迭代
std::map
的事实表明,您很可能使用了错误的容器(或者第3到第5个元素的逻辑是错误的)

所以您知道要做什么,问题在哪里?导致问题的代码在哪里?使用
std::next
推进
begin
迭代器。您知道(auto it=m.begin();it!=m.end();++it)的
的那些“老”示例吗?实际上,除了
begin
end
之外,您还可以使用其他迭代器值。第三个元素:
std::next(map.begin(),2)
5th元素
std::next(map.begin(),4)
值得保存
std::next(m.begin(),5)的值而不是每次循环都重新计算,存储结束条件迭代器会有好处吗?如果映射没有使用循环进行修改,编译器会有足够的意识优化
std::next
吗?我怀疑编译器会有足够的意识。需要注意的是,如果映射没有至少5个元素,这将导致未定义的行为。根据OP的情况,一个大小检查或一个
assert
语句可能是合适的。我只是想知道是否有可能我没有在任何地方实现它✌@一切皆有可能,问题是价格是多少。