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()
endend()
。我想用它的范围像从第三个元素到第五个元素
我想用它的范围像从第三元素到第五元素
元素
由于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
语句可能是合适的。我只是想知道是否有可能我没有在任何地方实现它✌@一切皆有可能,问题是价格是多少。