是否有任何理由说STL不提供通过索引返回迭代器的函数?

时间:2010-01-14 20:55:03

标签: c++ stl iterator

是否有理由说STL没有提供通过索引将迭代器返回容器的函数?

例如,假设我想将一个元素插入std::list但是在第n个位置。看来我必须通过类似begin()之类的东西来检索迭代器,并将n添加到该迭代器中。我想如果我能在第n个位置获得一个像std::list::get_nth_iterator(n)这样的迭代器会更容易。

我怀疑我误解了STL的原理。任何人都可以帮忙解释一下吗?

由于 BeeBand

4 个答案:

答案 0 :(得分:12)

您可以使用advance()标题中的<iterator>

<击>     list<foo>::iterator iter = advance(someFooList.begin(), n);

list<foo>::iterator iter = someFooList.begin();

std::advance( iter, n);

如果迭代器支持随机访问(如vector),它将非常有效,如果它只支持增加(或减少)迭代器,如list,它将起作用但仅作为好吧。

答案 1 :(得分:5)

std::list是一个链接列表。所以它不支持随机访问。要到达列表中的第n个位置,您必须从头开始并遍历所有节点,直到到达n。这是非常昂贵的(O(n)),因此有一个不建议这笔费用的方法是不好的。 get_nth_iterator(n)意味着获取指向第n个节点的迭代器很便宜。

std::vector当然直接使用[]运算符支持这一点,因为数据结构支持随机访问,因此对它来说非常便宜。

答案 2 :(得分:2)

std :: list不是随机访问容器,因此没有理由访问第n个元素。如果你需要这个,请考虑使用std :: vector代替..

答案 3 :(得分:1)

一般来说,任何可能成本高昂的东西都会有点笨拙,所以你不会偶然做到这一点。使用您的示例,使用提供随机访问迭代器的容器,它只是container.begin()+n,但对于std::list(提供前向迭代器),您需要使用list.begin()后跟advance()

如果你想获得N th 迭代器,你可能不应该首先使用std::list。再说一次,如果你以“机会”开始这句话,它仍将接近为真...