【发布时间】:2014-03-04 07:02:05
【问题描述】:
所以我有一个清单。我想打印该列表中用空格分隔的所有元素。
我首先想到的是做,
for (auto& ele : somelist)
{
cout << ele << ' ';
}
或者,
for (auto& ele : somelist)
{
cout << ' ' << ele;
}
问题在于引入了额外的空间。
因此,处理多余空间的一种方法是使用条件。
for (int idx{}; idx < somelist.size(); ++idx)
{
if (idx == 0)
cout << somelist[idx];
else
cout << ' ' << somelist[idx];
}
或者,
for (int idx{}; idx < somelist.size(); ++idx)
{
if (idx == somelist.size() - 1)
cout << somelist[idx];
else
cout << somelist[idx] << ' ';
}
但是有一个条件只有一次才会成立,这让我很困扰。我想出了自己的方法来打印一个列表,使用 lambdas 来管理是否插入了额外的空间,而不检查每次迭代。
#include <iostream>
#include <functional>
int main(int argc, char *argv[])
{
auto printHead = [] (int num)
{
std::cout << num;
};
auto printTail = [] (int num)
{
std::cout << ' ' << num;
};
// Need explicit type for lambda if its going to be captured
std::function<void(int)> print = [&printHead, &printTail, &print] (int num)
{
printHead(num);
print = printTail;
};
for (auto& element : {1,2,3,4,5,6,6,7,8,9,6})
{
print(element);
}
return 0;
}
假设这个解决方案在性能方面比原始条件版本更有效,是否合理?
【问题讨论】:
-
考虑到使用
std::function的开销,可能不会。这些天,分支预测非常好。话虽如此,I/O 时间将在这里绝对占主导地位,根本不值得担心这样的微优化。 -
对。并且给定一个更大的列表,大到足以减轻
std::function的开销,它只会让分支预测更有理由相信该条件不适用于大多数情况。 -
@Yuushi 需要明确的是,唯一能阻止它有效工作的方法是
std::function?如果我设法在不使用它的情况下做到这一点,它会起作用吗? -
可能。您有什么理由如此担心这里的开销吗?
-
并非如此。我只是想知道分配 lambdas 是否会产生开销。我认为
print = printTail会产生额外的开销。
标签: c++ list loops c++11 lambda