迭代程序.为什么要使用它们
Iterators.. why use them?
在STL库中,一些容器具有迭代器,通常认为它们是遍历这些容器的高级方法,而不是简单的循环,例如
for ( int i=0; i < vecVector.size(); i++ )
{
..
}
有人能告诉我为什么以及在什么情况下我应该使用迭代器吗?在哪些情况下我可以使用上面的代码片段吗?
请注意,vector的通常实现不会使用"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;
}
在您的示例中,对vecVector.size()的调用效率不如使用迭代器。迭代器本质上封装了您,使您不必担心被迭代的容器的大小。此外,迭代器不必按顺序进行。它只需要以它认为合适的方式响应下一个呼叫。
好吧,首先,如果你把向量变成一个列表,上面的内容将不再有效。
Iterator允许您创建不需要知道其工作的容器类型的函数模板。您甚至可以执行以下操作:
#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
-循环中的预期行为。
此外,性能问题只是经过衡量和证明的问题。
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么这个 c++ 代码打印出长度 5,当我打印出字符串时,程序会自动终止?
- 为什么异常不退出程序?
- 为什么我的 IExtractIcon 处理程序没有被调用?
- 为什么我的程序在for循环中k=0时返回垃圾值
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 为什么这个程序的结果是3 "born"?和 4 死
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 尽管我的功能和cout语句的放置错误,但我的程序为什么会起作用
- C++简单的程序 - 为什么我的"res"不进入我的向量?创建一个接受输入 (4+44-67+235) 并输出结果的程序
- 额外的反斜杠字符不会影响我的程序.为什么
- linux C/C++套接字程序为什么没有出现ECONNRESET错误
- C++程序.为什么这段代码有效
- C++迭代程序-为什么我必须添加.begin()才能获得二进制搜索的中点
- 迭代程序.为什么要使用它们