这是我的代码。它是正确的。
set<float> set1;
set1.insert(1);
set1.insert(2);
set1.insert(3);
set<float>::iterator it1;
for (it1 = set1.begin(); it1 != set1.end(); it1 ++)
{
cout << *it1 <<" ";
}
但是为什么以下代码不起作用?
set<float> set1;
set1.insert(1);
set1.insert(2);
set1.insert(3);
set<float>::iterator it1;
for (it1 = set1.begin(); it1 != set1.end()-1; it1 ++)
{
cout << *it1 <<" ";
}
答案 0 :(得分:3)
std::set
的迭代器是bidirectional。这意味着它们支持任一方向的单步(it++
,it--
等),但不支持任意长度的增量(it + N
等)。
这可能是因为std::set
通常被实现为自平衡二进制搜索树,因此它将是一种效率低下的O(N)操作。
使用std::advance
,std::next
或std::prev
可以将双向迭代器递增/递减任意数量:
std::advance(it, 42);
it = std::next(it, 42);
it = std::prev(it, 42);
答案 1 :(得分:1)
operator-
和operator+
,它们不是随机访问类型,而是双向类型。
参考:Here
答案 2 :(得分:1)
set<>::begin()
返回的迭代器类型未指定operator+(int)
。但是,在您的示例中,您可以改为使用operator--()
:
for (it1 = set1.begin(); it1 != --set1.end(); ++it1)
{
cout << *it1 << " ";
}