如何写入条件for循环(如果是通过A的真循环,则通过B循环)

时间:2014-12-08 22:10:18

标签: c++ for-loop

我做了一些搜索,但找不到我真正想要的东西。

我有以下情景: 有两个不同类型的容器。例如,一个是vector<netIterator> A,另一个是list<netIterator *> B

if (c) 
  for loop on A { doingSth using the current netIterator; } 
else
  for loop on B { doingSth using the current netIterator; }
现在,doSth需要大约90行。

如果我将其定义为内联函数,则无法正确内联,并且运行时损失很大。 (添加更多测试数据: 使用非内联函数(有大约12个参数),运行时间为300秒;使用重复的代码,运行时间约为15秒。 请注意,容器中有150万个元素。 )

无论如何有效地基于c循环A或B而不重复代码&#34; doingSth&#34;?

这是C ++,我们公司目前不允许使用Boost库。

感谢您的任何建议!

{在我发布问题后的第二天更新:

在我的同事的帮助下,我终于找到了运行时增加的真正原因。这不是因为函数没有内联,而是因为函数的两个向量参数是通过复制而不是通过引用传递的。在每个函数调用中,向量被复制,构造,生长和销毁,在150万次迭代中需要300秒。解决问题后,使用函数的运行时间可以忽略不计。

该功能由IDE使用&#34;提取方法&#34;提取。重构,我认为这是正确的,并没有仔细检查参数列表,但实际上这次它做得非常好。之前我确实使用过它,它做得很好,但这次很糟糕。

再次感谢所有回答和评论我的问题!这是我在这里的第一个问题,我得到答案的速度有多快(几分钟!)。我喜欢所有的答案,很高兴向你学习!

}

2 个答案:

答案 0 :(得分:2)

当然有办法:

void f(bool c, vector<T>& a, list<T>& b) {
    auto lambda = [&](T& t) {/* your magic here */}
    if(c)
        for(auto&& x : a)
            lambda(x);
    else
        for(auto&& x : b)
            lambda(x);
}

你也可以同样完成同样的功能。

但在你抱怨调用函数与内联,测量和比较的巨大运行时间惩罚之前! (内联的二进制大小相同,当然。)

答案 1 :(得分:0)

嗯。好吧,我想你可以做点像

template<typename Container, typename Deref>
void loop_over(Container &container, Deref deref) {
  for(auto &&element_raw : container) {
    auto &&element = deref(element_raw);

    // doSth with element
  }
}

...

if(c) {
  loop_over(A, [](netIterator &i) { return  i; });
} else {
  loop_over(B, [](netIterator *i) { return *i; });
}

这应该给你两个代码专业。

但我很难相信,如果不能内联90行代码会对性能产生巨大影响。你能可靠地测量它吗?