迭代器从C++中的特定位置获取地图

Uts*_*v T 3 c++ iterator map

我有一个元素映射和一个嵌套循环来迭代它.但我希望迭代器的行为类似于:

    map<int,int>::iterator it;
    map<int,int>::iterator it1;
    bool flag=false;

    for(it=m.begin();it!= m.end()-1;it++)
    {
        for(it1 = it+1;it1 != m.end();it1++)
        {
            if((it->first < it1->first)&&(it->second > it1->second))
            {
                flag=true;
                break;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

基本上,外部循环应该从最后但一个位置开始终止,内部循环必须从外部循环迭代器开始迭代.但是这段代码似乎不起作用.(其中+不匹配+ 1)未定义任何帮助将非常感激.(请指出任何重复的链接,因为我找不到一张地图.)谢谢!

Pio*_*cki 7

std::map<K,V,C,A>::iterator是一个双向迭代,这意味着它不提供operator+既不operator-(仅operator++operator--在前缀和postifx形式).

在C++ 11中,仍然可以使用std::next()或移动迭代器std::prev():

for (it = m.begin(); it != std::prev(m.end()); ++it)
//                         ~~~~~~~~^ instead of m.end()-1
{
    for (it1 = std::next(it); it1 != m.end(); ++it1)
    //         ~~~~~~~~^ to get the it+1
Run Code Online (Sandbox Code Playgroud)

在C++ 03中,您可以使用std::advance()相反的方式向前/向后移动给定的间隔(不同之处在于它在实际对象上操作而不是创建类似的副本std::next):

it1 = it;
for (std::advance(it1, 1); it1 != m.end(); ++it1)
//        ~~~~~~^      ^ number of steps    
Run Code Online (Sandbox Code Playgroud)

两种方法都提供了增加/减少给定迭代器的最佳方法(基于迭代器的特征).