加上set迭代器的运算符不起作用

时间:2014-11-25 17:18:55

标签: c++

这很好用,但看起来很难看

#include <iostream>
#include <set>
#include <set>

int main ()
{
    std::set<int> v;
    for(int i=0;i<5;i++)
    {
        v.insert(i);
    }
    for(std::set<int>::iterator it1 = v.begin(); it1!=v.end(); ++it1)
    {
        std::set<int>::iterator it2=it1;
        std::advance(it2,1);
        for(; it2!=v.end(); ++it2)
        {
           std::cout<<*it1<<" "<<*it2<<std::endl;
        }
    }

    return 0;
}

这不能编译,因为set :: iterator没有+运算符,为什么呢?这周围有一种优雅的方式吗?

#include <iostream>
#include <set>
#include <set>

int main ()
{
    std::set<int> v;
    for(int i=0;i<5;i++)
    {
        v.insert(i);
    }
    for(std::set<int>::iterator it1 = v.begin(); it1!=v.end(); ++it1)
    {
        for(std::set<int>::iterator it2=it1+1; it2!=v.end(); ++it2)
        {
        std::cout<<*it1<<" "<<*it2<<std::endl;
        }
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

std::set的迭代器是bidirectional iterators,因为内部集合是基于节点的结构。对+应用偏移量对于这种结构将是O(N),因此它的迭代器不会直接支持它。随机访问迭代器支持此操作,它是O(1)。

答案 1 :(得分:2)

&#39; +&#39;仅为随机访问迭代器提供操作。并且std::set没有使用随机访问迭代器