如何迭代打印SET(STL)中的元素

时间:2014-08-03 07:16:32

标签: c++ stl set

这是我的代码。它是正确的。

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 <<" ";
    }

3 个答案:

答案 0 :(得分:3)

std::set的迭代器是bidirectional。这意味着它们支持任一方向的单步(it++it--等),但不支持任意长度的增量(it + N等)。

这可能是因为std::set通常被实现为自平衡二进制搜索树,因此它将是一种效率低下的O(N)操作。

使用std::advancestd::nextstd::prev可以将双向迭代器递增/递减任意数量:

std::advance(it, 42);
it = std::next(it, 42);
it = std::prev(it, 42);

答案 1 :(得分:1)

set迭代器不支持

operator-operator+,它们不是随机访问类型,而是双向类型。

参考:Here

答案 2 :(得分:1)

set<>::begin()返回的迭代器类型未指定operator+(int)。但是,在您的示例中,您可以改为使用operator--()

for (it1 = set1.begin(); it1 != --set1.end(); ++it1)
{
    cout << *it1 << " ";
}