c ++ 11用于多个项目的容器循环

时间:2015-06-08 09:13:23

标签: c++ c++11 for-loop

我想知道在c ++ 11语法中是否有可能为多个项目使用基于for for循环的新容器,例如:

std::vector<double> x;
std::vector<double> y;

for (double& xp, yp : x, y)
{
     std::cout << xp << yp << std::endl;
}

我无法找到有关将此循环用于多个容器的任何信息。我将非常感谢你的帮助。

经典for循环中的示例效果:

std::vector<double>::iterator itX = m_x.begin();
std::vector<double>::iterator itY = m_y.begin();

for (uint32_t i = 0; i < m_x.size(); i++, itX++, itY++)
{
    // operations on the m_x and m_y vectors
}

2 个答案:

答案 0 :(得分:5)

语言工作组中有一个请求支持非常相似的语法,可以在许多容器上同时进行迭代:

  

部分:6.5.4 [stmt.ranged] 状态:打开提交者:Gabriel Dos Reis

     

已开启:2013-01-12 上次修改:2015-05-22

     

<强>讨论

     

新式'for'语法允许我们在迭代单个序列时省去管理迭代器声明。然而,当同时迭代两个或更多个序列时,负担和噪声仍然存在。我们应该扩展语法以允许它。例如。一个应该能写:

for (auto& x : v; auto& y : w)
  a = combine(v, w, a);
     

而不是吵闹的

auto p1 = v.begin();
auto q1 = v.end();
auto p2 = w.begin();
auto q2 = w.end();
while (p1 < q1 and p2 < q2) {
   a = combine(*p1, *p2, a);
   ++p1;
   ++p2;
}

请参阅http://cplusplus.github.io/EWG/ewg-active.html#43

所以它可能发生但不会在不久的将来发生。

同时,最佳选择可能是经典的for循环。

答案 1 :(得分:2)

我知道现在有点老了,但我有一个类似的查询和TC的“你需要一些图书馆的帮助”评论让我笑了,因为我最后解决了类似的问题只有几个额外的字符。为了回收OP的第一个例子,并假设向量保证相同的大小,你可以使C ++ 11引用符合老式指针算术,如下所示:

<div class="channels-container">
  <ul>
    <a href="/category/funny">
      <li>Funny</li>
    </a>
    <a href="/category/gaming">
      <li>Gaming</li>
    </a>
    <a href="/category/gifs">
      <li>GIFs</li>
    </a>
    <a href="/category/movies">
      <li>Movies</li>
    </a>
    <a href="/category/music">
      <li>Music</li>
    </a>
    <a href="/category/news">
      <li>News</li>
    </a>
    <a href="/category/pics">
      <li>Pics</li>
    </a>
    <a href="/category/politics">
      <li>Politics</li>
    </a>
    <a href="/category/random">
      <li>Random</li>
    </a>
    <a href="/category/science">
      <li>Science</li>
    </a>
    <a href="/category/sports">
      <li>Sports</li>
    </a>
    <a href="/category/style">
      <li>Style</li>
    </a>
    <a href="/category=/technology">
      <li>Technology</li>
    </a>
    <a href="/category/videos">
      <li>Videos</li>
    </a>
  </ul>
</div>

可能最好不要在生产代码中使用(我是一个自学成才的爱好者编码器,所以 meh )但是它运行得很好,很简单,不需要库而且似乎没有受到任何影响显着的速度惩罚(至少,我注意到了)。它甚至适用于最小的C ++ 11环境(例如VC11)。为了清楚起见,我在稍微不同的上下文中使用了它,其中(给出上面的例子)我只在实际需要改变时才访问y []因此噪声中的任何可能的减速都会减少,但是因为y [在与x []相同的索引处需要访问,并且不需要额外的变量/迭代器,它完全适合该法案。

另外,对于manlio的答案+1;你会相信我在寻找替代方案之前,是否真的试图直观地使用完全这种语法? :o