Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 头尾打印是否比检查结束或开始更有效?_C++_List_Loops_C++11_Lambda - Fatal编程技术网

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 << ", "; }
);