C++ 头尾打印是否比检查结束或开始更有效?
所以我有一个清单。我想打印列表中的所有元素,用空格分隔 我想到的第一件事就是做C++ 头尾打印是否比检查结束或开始更有效?,c++,list,loops,c++11,lambda,C++,List,Loops,C++11,Lambda,所以我有一个清单。我想打印列表中的所有元素,用空格分隔 我想到的第一件事就是做 for (auto& ele : somelist) { cout << ele << ' '; } for(自动&ele:somelist) { cout把条件放在循环之外怎么样 if (!somelist.empty()) std::cout << somelist[0]; for (int i = 1; i < somelist.size(); ++i)
for (auto& ele : somelist)
{
cout << ele << ' ';
}
for(自动&ele:somelist)
{
cout把条件放在循环之外怎么样
if (!somelist.empty()) std::cout << somelist[0];
for (int i = 1; i < somelist.size(); ++i)
{
std::cout << ' ' << somelist[i];
}
if(!somelist.empty())std::cout一个不涉及std::function
的简单解决方案怎么样
char space = '\0';
for (auto& ele : somelist)
{
cout << space << ele;
space = ' ';
}
char-space='\0';
用于(自动和删除:somelist)
{
cout为什么不实现“您可以使用“”构造(我不确定我是否计算了与@Cornstalks相同的指令,但是gcc-S-o-
给出了153行汇编):
可以这样调用(使用C++14通用lambda):
循环和半循环(
开始(somelist),结束(somelist),
[](自动e){std::cout考虑到使用std::function
的开销,可能不会。分支预测现在相当不错。也就是说,I/O时间将在这里占据绝对主导地位,真的不值得担心像这样的微优化。好吧。并且给出了一个更大的列表,足以承受std:的开销:函数
要缓解,它只会让分支预测有更多的理由相信这种情况在大多数情况下都不会持续。@Yuushi只是想澄清一下,是不是唯一的事情阻止了它有效地工作std::function
?如果我不使用它,它会工作吗?潜在的。你有什么理由不这样做吗我们非常担心这里的开销?不是真的。我只是想知道分配lambda是否会产生开销。我认为print=printTail
会产生额外的开销。然而,在实现自定义时,对,但OP当前代码的复杂之处似乎是有一个丑陋的条件检查处理打印最后一个元素。我想,这可能会通过OOP方法更清晰地抽象出来。关于第二个实现,我会将first++
移动到for循环的初始化器中,并将for循环移动到if语句块中。很好,很好的替代方法。仅供参考,我是在近似指令通过执行otool-tv可执行文件\u name | wc-l
(在我的系统中,代码是~228条指令)来计数。啊,很好,我不知道这个工具。
for (int idx{}; idx < somelist.size(); ++idx)
{
if (idx == somelist.size() - 1)
cout << somelist[idx];
else
cout << somelist[idx] << ' ';
}
#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;
}
if (!somelist.empty()) std::cout << somelist[0];
for (int i = 1; i < somelist.size(); ++i)
{
std::cout << ' ' << somelist[i];
}
std::vector<int> somelist = {1,2,3,4,5,6,6,7,8,9,6};
for (int idx{}; idx < somelist.size(); ++idx)
{
if (idx == 0)
std::cout << somelist[idx];
else
std::cout << ' ' << somelist[idx];
}
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;
};
std::vector<int> somelist = {1,2,3,4,5,6,6,7,8,9,6};
for (auto& element : somelist)
{
print(element);
}
std::vector<int> somelist = {1,2,3,4,5,6,6,7,8,9,6};
if (!somelist.empty()) std::cout << somelist[0];
for (int i = 1; i < somelist.size(); ++i)
{
std::cout << ' ' << somelist[i];
}
char space = '\0';
for (auto& ele : somelist)
{
cout << space << ele;
space = ' ';
}
auto first = somelist.cbegin();
auto last = somelist.cend();
if(first != last) {
cout << *first++;
}
for(; first != last; ++first) {
cout << ' ' << *first;
}
cout << somelist;
#include <iostream>
#include <vector>
int main()
{
auto somelist = std::vector<int>{1,2,3,4,5,6,6,7,8,9,6};
auto first = begin(somelist), last = end(somelist);
if (first != last) { // initial check
while (true) {
std::cout << *first++;
if (first == last) break; // check in the middle
std::cout << ", ";
}
}
}
template<class It, class UnaryOp1, class UnaryOp2>
void loop_and_a_half(It first, It last, UnaryOp1 op1, UnaryOp2 op2)
{
if (first == last) return;
while (true) {
op1(*first++);
if (first == last) break;
op2(*first);
}
}
loop_and_a_half(
begin(somelist), end(somelist),
[](auto e) { std::cout << e; },
[](auto) { std::cout << ", "; }
);