是否有理由说STL没有提供通过索引将迭代器返回容器的函数?
例如,假设我想将一个元素插入std::list
但是在第n个位置。看来我必须通过类似begin()
之类的东西来检索迭代器,并将n
添加到该迭代器中。我想如果我能在第n个位置获得一个像std::list::get_nth_iterator(n)
这样的迭代器会更容易。
我怀疑我误解了STL的原理。任何人都可以帮忙解释一下吗?
由于 BeeBand
答案 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
。再说一次,如果你以“机会”开始这句话,它仍将接近为真...