这个问题已经有一个答案在这里:

在STL图书馆一些容器必须迭代,它是普遍认为,他们是一个卓越的方式重复这些集装箱,而不是简单的循环例如

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

..

}

任何人都可以告诉我为什么和在什么情况下我应该使用的迭代和在什么情况下代码段上述好吗?

有帮助吗?

解决方案

注意,通常执行的矢量不会使用一个"int"作的类型的指标/尺寸。所以你的代码将至少招来编译器的警告。

泛型

迭代增加的泛型的代码。

例如:

typedef std::vector<int> Container ;

void doSomething(Container & p_aC)
{
    for(Container::iterator it = p_aC.begin(), itEnd = p_aC.end(); it != itEnd; ++it)
    {
       int & i = *it ; // i is now a reference to the value iterated
       // do something with "i"
    }
}

现在,让我们来想象一下你改变的矢量转列表(因为在你的情况下,表现在更好)。你只需要更改typedef宣言》,并重新编译代码。

你应该有用基于指数码相反,它将有必要重新书写。

访问

迭代应该被视像是一种超级指针。它的"点"数值(或者,在情况的地图,以对key/value)。

但它具有法移动到一个新的项目在容器中。或者先前的。有些容器提供甚至随机访问(矢和双端).

算法

最STL算法的工作迭代或范围的迭代器(同样,由于泛型).你不会是能够使用一个指数,在这里。

其他提示

使用的迭代使你的代码无关的关于执行你的容器。如果随机访问为你的容器是廉价的,没有多少差别性能。

但是,在很多情况下你不会知道这是否是这种情况。如果你试图使用您的方法上的一个链接清单,例如与下标,容器必须要走的清单上的每一次迭代要找到你的元素。

所以除非你知道的随机访问你的容器是廉价的,使用一个迭代器。

如果你迭代使用作为参数,以你的功能,可以将它从一种类型的"容器"使用。例如,可直接结果的一个功能,以控制台产出,而不是一个载体(如下文)。这招可以非常强大的降低之间的联接你的班级。松散耦合的课程很容易检测。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

template <typename InputIterator, typename OutputIterator>
void AddOne(InputIterator begin, InputIterator end, OutputIterator dest)
{
    while (begin != end)
    {
        *dest = *begin + 1;
        ++dest;
        ++begin;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    vector<int> data;
    data.push_back(1);
    data.push_back(2);
    data.push_back(3);

    // Compute intermediate results vector and dump to console
    vector<int> results;
    AddOne(data.begin(), data.end(), back_inserter(results));
    copy(results.begin(), results.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    // Compute results and send directly to console, no intermediate vector required
    AddOne(data.begin(), data.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    return 0;
}

在你的例子,呼吁vecVector.大小()效率低于使用一个迭代器。迭代基本上封装你从有担心的尺寸的容器被迭代。此外,迭代不会没有必要去顺序。它只是具有响应.下一个电话在任何方式,它认为合适的。

好吧,对于一件事情上将不再起作用,如果你把这一矢量纳入一份清单。

迭代能让你建功能的模板,不需要知道的容器的类型,他们的工作。你甚至可以做到以下几点:

#include <algorithm>

void printvalue(double s)
{
    // Do something with s
}

int _tmain(int argc, _TCHAR* argv[])
{
    double s[20] = {0};

    std::for_each(s, s+20, printvalue);

    return 0;
}

那是因为标准指针也是一个有效的迭代进for_each.

Dave

迭代主要是一个更高的水平抽象概念。

你段假定,可以将该容器编入索引。这是真的 std::vector<> 和一些其它的容器,例如原阵列。

std::set<> 缺乏引完全和指标的操作者 std::map<> 将插入任何论据是提供给它进入地图-不预期的行为在您的 for-循环。

此外,性问题只是问题的当测量和证明。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top