所有,

std::map<int, std::string> addressee;
std::map<int, std::string>::iterator it1, it2;

for( it1 = addressee.begin(); it1 != addressee().end(); it1++ )
{
    bool found = false;
    for( it2 = it1 + 1; it2 != addressee.end() && !found; it2++ )
    {
       if( it1->second == it1->second )
       {
           printf( "Multiple occurences of addressees found" );
           found = true;
       }
    }
}


gcc吐出一个错误:操作符+不匹配。

这段代码是我现在正在尝试做的简化版本。我猜我可以使用std :: advance(),但似乎只是在浪费函数调用的时间。

有更好的解决方案吗?

最佳答案

std::map没有随机访问迭代器,只有双向迭代器,因此没有+ n操作。而是使用std::next

#include <iterator>
#include <map>

// ...

for (auto it1 = addressee.begin(), e = addressee.end(); it1 != e; ++it1)
{
    for (auto it2 = std::next(it1); it2 != e; ++it2)
    {
        if (it1->second == it2->second)
        {
            // ...
            break;
        }
    }
}


实际上,您应该始终使用std::next,因为它知道其参数具有哪个迭代器类别以及计算下一个迭代器的最有效方法是什么。这样,您不必在乎碰巧使用的特定容器。

09-07 07:21