这工作正常,但看起来很丑
#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;
}
最佳答案
std::set
的迭代器是bidirectional iterators,因为内部集合是基于节点的结构。对于这种结构,使用+
施加偏移量将为O(N),因此其迭代器不直接支持该结构。随机访问迭代器支持此操作,其为O(1)。