增加迭代器标准映射

时间:2015-03-02 21:46:45

标签: c++ dictionary iterator

ALL,

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吐出错误:不匹配operator +。

此代码是我正在尝试做的简化版本。我想我可以使用std :: advance(),但它似乎只是浪费了函数调用。

有更好的解决办法吗?

2 个答案:

答案 0 :(得分:8)

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,因为它知道它的参数具有哪个迭代器类别以及计算下一个迭代器的最有效方法是什么。这样,您就不必关心您正在使用的特定容器。

答案 1 :(得分:0)

@Kerrek已经指出了如何处理你在句法层面遇到的问题。

我将在一个更算法的层面上考虑这个问题 - 你真正想要完成的是什么,而不仅仅是看如何修复代码的特定行。

除非涉及的集合可靠 tiny ,否则此操作的效率根本不重要,我会从集合中复制映射值,然后使用{{1} }和sort就可以看到是否有任何重复:

unique

这降低了从O(N 2 )到O(N log N)的复杂性,如果集合很大,这通常会非常重要。