【发布时间】:2013-02-23 17:57:03
【问题描述】:
根据我所学到的迭代容器的方法,如 std::vector,是使用迭代器,如下所示:
for(vector<int>::iterator it = numbers.begin(); it != numbers.end(); it++)
我的问题是为什么不使用standatd for 迭代容器,它更快,因为不需要像numbers.begin() 和numbers.end() 那样调用函数。
根据我的尝试,我发现使用 for 比使用迭代器快 X 30。
我写了这段代码:
vector<int> numbers;
for (int i = 0; i < 5000000; i++)
{
numbers.push_back(i);
}
time_t t = time(0);
struct tm * now = localtime(&t);
cout << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec << "\n";
for(vector<int>::iterator it = numbers.begin(); it != numbers.end(); it++)
{
*it = 7;
}
t = time(0);
now = localtime(&t);
cout << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec << "\n";
int size = numbers.size();
for (int i = 0; i < size; i++)
{
numbers[i] = i;
}
t = time(0);
now = localtime(&t);
cout << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec;
输出是:
19:28:25
19:28:56
19:28:57
【问题讨论】:
-
您似乎认为标准容器是可索引的(即
numbers[i]),这当然不是常态,而是例外 -
在您的示例中,您在这两种情况下都使用“标准”
for。 -
您是否启用了编译器优化?
vector<T>::iterator在调试版本和发布版本之间的行为可能存在巨大差异。 -
@K-ballo - 你是什么意思?按索引接近元素是错误的吗?效果很好!
-
@Nikos - 我的意思是没有迭代器。