STL迭代器 - 目的

时间:2010-06-15 14:21:10

标签: c++ stl iterator

STL迭代器的目的是什么?程序员为什么要创建这个概念呢?

10 个答案:

答案 0 :(得分:24)

迭代器允许您将算法与容器分开。只要你有一个开始和结束迭代器,并且知道迭代器的功能(随机访问等),你就可以在迭代器指定的范围内进行操作。例如,请参阅std::for_eachstd::transform。这样,您只需实现一个算法版本,而不需要为您希望它运行的每个容器编写一个新版本。

答案 1 :(得分:4)

迭代器允许您使用类似指针的语义来遍历容器成员,否则这对于具有非连续存储的容器来说是不切实际的。

答案 2 :(得分:4)

迭代器提供抽象。对于只想对其内容进行操作的方法,如何遍历某个容器并不重要。当然,迭代器需要比这更通用。您希望使用最快的操作,但仍希望编写通用代码,或者您希望支持输出的迭代器。这就是类型特征的来源。这个(与概念结合)广泛用于STL。有关概述,请参阅SGI Documentation

另一方面:迭代器不是解决各种问题的最佳解决方案,因此通常会推广到范围。 (有关示例或boost range来自boostcon的精彩演讲,请参阅this

答案 3 :(得分:3)

  

STL迭代器有哪些优点?

  • 它们允许您从迭代值中抽象如何迭代值,从而允许编写通用算法。

示例:

std::vector<int> cont;
auto position = std::find(cont.begin(), cont.end(), 1); // forward search
auto position = std::find(cont.rbegin(), cont.rend(), 1); // backward search
  • 它们允许实现安全解除引用(如果迭代器没有指向有效值并且取消引用它,则可以设置为抛出异常),或者任何其他安全检查。

  • 它们允许将任意流视为可迭代序列。

这允许您迭代I / O流,例如,编写如下代码:

std::vector<int> cont;
copy( cont.begin(), cont.end(), std::ostream_iterator<int>(std::cout, " ") );

答案 4 :(得分:2)

迭代器本质上是C语言的改进版本.BTW两者可以混合,因为迭代器的行为类似于指针。

在C ++中可以正常工作:

char buf1[3] = { 1, 2, 3 };
std::vector<char> buf2;
buf2.resize(sizeof(buf1));
std::copy( buf1, buf1+sizeof(buf1), buf2.begin() );
std::copy( buf2.begin(), buf2.end(), buf1 );

答案 5 :(得分:1)

迭代器可以让您的生活更轻松,因为您无需担心正在使用的容器的底层结构,以便迭代它们。这使您可以花费更多时间来处理所涉及的算法,而不是实现的具体细节(可能很复杂)。

答案 6 :(得分:1)

看起来更加成熟,可以写

vector<myclass>::iterator myClassVectorIterator;
for(myClassVectorIterator = myClassVector.begin(); 
        myClassVectorIterator != myClassVector.end();
        myClassVectorIterator++)

而不是

for (int i=0;i<size;i++) { ...

答案 7 :(得分:1)

STL中迭代器的主要原因是允许编写算法,而不依赖于数据的存储方式。当然,存储确实(或至少可以)施加一些限制,这导致各种类型的迭代器(例如,RandomAccess与输入),但这些限制(意图是)尽可能独立于底层数据结构。 / p>

例如,这允许merge算法从vectorlist获取输入,并将输出写入ostream_iterator,而无需付费任何关注来源和/或目的地之间的差异。

答案 8 :(得分:0)

这看起来像是一个家庭作业问题......

STL是C ++。迭代器可以很容易地遍历事物列表(通常提供一些STL魔法juju来处理事物类型)。

答案 9 :(得分:0)

优于什么​​?您是否希望将迭代器与之比较?

C样式的整数序列,例如for(i=0;i!=N;++i),假设容器中随机访问的成本,特别是访问元素[i]的成本,可以忽略不计。

类似地,指针增量(例如for(p=&arr[0]; p != p+N; ++p)假定序列的实现是连续的内存块。

已经提出了更高级别的替代方案,并且已经实施了许范围,Perl风格的“foreach”语法,Lisp风格的“应用”。