【发布时间】:2010-10-21 01:39:50
【问题描述】:
在性能方面,什么会更快?有区别吗?它依赖于平台吗?
//1. Using vector<string>::iterator:
vector<string> vs = GetVector();
for(vector<string>::iterator it = vs.begin(); it != vs.end(); ++it)
{
*it = "Am I faster?";
}
//2. Using size_t index:
for(size_t i = 0; i < vs.size(); ++i)
{
//One option:
vs.at(i) = "Am I faster?";
//Another option:
vs[i] = "Am I faster?";
}
【问题讨论】:
-
我自己一直在做基准测试,vector.at 比使用迭代器慢得多,但是使用 vector[i] 比使用迭代器快得多。但是,您可以通过抓取指向第一个元素的指针并在当前指针小于或等于最后一个元素的指针时循环来使循环更快;类似于迭代器,但开销较小,因此在代码方面看起来不太好。这个测试是在 Windows 上使用 Visual Studio 2008 完成的。关于你的问题,我相信这取决于平台,它取决于实现。
-
但是,从我的题外话继续我自己迭代指针,无论平台如何,都应该总是更快。
-
@leetNightshade:某些编译器在运行下标而不是指针算术时,可以使用 SIMD 指令,这会使其更快。
-
每次循环时都在实例化结束迭代器,并且迭代器实例化不是免费的。尝试缓存您的结束迭代器。试试这个:
for(vector<int>::iterator it = v.begin(), end= v.end(); it != end; ++it) { ... }
标签: c++ performance stl vector iterator