在STL库中,一些容器具有迭代器,并且通常认为它们是遍历这些容器的 superior way,而不是简单的for循环。
for ( int i=0; i < vecVector.size(); i++ )
{
..
}
有谁能告诉我为什么以及在什么情况下我应该使用迭代器,以及在什么情况下使用上面的代码片段吗?
在STL库中,一些容器具有迭代器,并且通常认为它们是遍历这些容器的 superior way,而不是简单的for循环。
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声明并重新编译代码。
如果您使用基于索引的代码,那么它需要被重新编写。
迭代器应该被视为一种超级指针。它“指向”值(或在映射的情况下指向键/值对)。
但它有方法可以移动到容器中的下一项或上一项。 一些容器甚至提供随机访问(例如向量和deque)。
大多数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;
}
迭代器主要是更高层次的抽象。
您的代码片段假设容器可以索引。对于std::vector<>
和一些其他容器,例如原始数组,这是正确的。
但是std::set<>
完全没有索引,而std::map<>
的索引运算符会将任何参数插入到映射中 - 这不是在您的for
循环中预期的行为。
此外,性能问题只有在经过测量并证明后才会成为问题。
首先,如果你将那个向量转换成列表,上述代码将不再起作用。
迭代器允许你创建函数模板,而这些模板不需要知道它们所操作的容器的类型。你甚至可以这样做:
#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