我昨天看到这位用户的帖子。我觉得那是一个很酷的输出向量的方法。于是我写了一个例子,并问自己这与for each
循环相比如何?
template <typename T>
void printVectorO(std::vector<T> &v)
{
std::cout << "Ostream_iterator contents: " << std::endl;
auto start = std::chrono::high_resolution_clock::now();
std::ostream_iterator<T> ost(std::cout, " ");
std::copy(begin(v), end(v), ost);
std::cout << std::endl;
auto end = std::chrono::high_resolution_clock::now();
auto time = end - start;
auto nano = std::chrono::duration_cast<std::chrono::nanoseconds>(time);
std::cout << "Ostream_iterator computation took: " << nano.count() << " nano seconds"<< std::endl;
std::cout << std::endl;
}
template <typename T>
void printVectorC(std::vector<T> &v)
{
std::cout << "For Each Loop contents: " << std::endl;
auto start = std::chrono::high_resolution_clock::now();
for (auto && e : v) std::cout << e << " ";
std::cout << std::endl;
auto end = std::chrono::high_resolution_clock::now();
auto time = end - start;
auto nano = std::chrono::duration_cast<std::chrono::nanoseconds>(time);
std::cout << "For Each Loop took: " << nano.count() << " nano seconds" << std::endl;
std::cout << std::endl;
}
我使用了3个向量来进行测试:
std::vector<double> doubles = { 3.15, 2.17, 2.555, 2.014 };
std::vector<std::string> strings = { "Hi", "how", "are", "you" };
std::vector<int> ints = { 3, 2 , 2 , 2 };
我得到了各种结果。当我输出双精度浮点数时(例如41856与11207和55198与10308纳秒),for each
循环总是比ostream_iterator
更快。有时,字符串ostream_iterator
胜过for each
循环,而在处理整数时,for each
循环和ostream_iterator
几乎保持不分伯仲。
这是为什么?ostream_iterator
的后台发生了什么?在效率和速度方面,何时应该使用ostream_iterator
而不是for each
循环?
copy
的代码周围添加一个循环,并在for
周围添加一个循环,重复感兴趣的代码一百万次左右,以消除可能影响您计时的其他因素。 - jxhstd::ostringstream
而不是std::cout
。将输出发送到std::cout
可能会反映有关输出缓冲区刷新的一些伪影。 - Sam Varshavchik