STL迭代器的目的是什么?程序员为什么要创建这个概念呢?
答案 0 :(得分:24)
迭代器允许您将算法与容器分开。只要你有一个开始和结束迭代器,并且知道迭代器的功能(随机访问等),你就可以在迭代器指定的范围内进行操作。例如,请参阅std::for_each
,std::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
算法从vector
和list
获取输入,并将输出写入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风格的“应用”。