【问题标题】:How do I use two consecutive elements of a deque at once in a for loop?如何在 for 循环中一次使用双端队列的两个连续元素?
【发布时间】:2016-07-10 19:29:56
【问题描述】:

我必须处理双端队列中的元素(从第一个到最后一个),但在每次迭代时,我都需要使用一个元素和下一个元素。所以我正在尝试编写一个以 mydeque.begin() 开始并在 mydeque[mydeque.size()-1] 结束的 for 循环。还;我想知道我的迭代器 deque::iterator 是否有下一个方法 (it->next()) 来进行像 *it - *it->next() 这样的操作。非常感谢。

【问题讨论】:

  • 为什么不简单地使用索引而不是迭代器呢?这应该使循环变得微不足道。
  • next(it) 返回 C++11 中的下一个迭代器。
  • 如果你必须使用迭代器,那么std::dequerandom access iterator 这意味着你可以做例如iter != std::end(the_deque) - 1*(iter + 1)(还有 iter[1])和 iter += 2
  • 顺便问一下,双端队列保证有偶数个值吗?里面可能有奇数个值吗? s1h给出的答案的正确性很大程度上取决于此。
  • 实际上 iter += 2 不会这样做,因为我使用了当前元素和下一个元素。在第一次迭代中,我使用元素 1 和 2,在第二次迭代中使用元素 2 和 3,依此类推。感谢您的评论

标签: c++ stl iterator deque


【解决方案1】:

方法如下:

#include <deque>
#include <iostream>

int main() {
std::deque<int> test = {1,2,3,4,5,6,7,8};
for(auto i = test.begin(); i != test.end(); i++) {
    auto next = std::next(i);
    std::cout << *i << *next << std::endl;
    if(next==test.end())
      {
       //Do something. This is the last element.
       break;
      }

}
}

编辑:注意只有一个元素的双端队列。通过执行检查来做到这一点,例如if(test.begin()==test.end())

【讨论】:

    【解决方案2】:

    编辑:我最初的解决方案确实有点容易出错且不精确。

    这可以使用迭代器轻松完成,请看这个小例子:

    #include <deque>
    #include <iostream>
    
    int main() {
        std::deque<int> test = {1,2,3,4,5,6,7};
        for(auto i = test.begin(); i != test.end(); ++i) {
            auto next = std::next(i);
            if(next != test.end()) {
                std::cout << *i << " " << *next << std::endl;
            }
        }
    }
    

    您可以简单地将迭代器增加 2 并使用 std::next 来选择以下项目(因为 std::next 的偏移量默认为 1)。

    【讨论】:

    • 你知道这可能会跳过最后一个元素吗?
    • 实际上 iter += 2 不会这样做,因为我使用了当前元素和下一个元素。在第一次迭代中,我使用元素 1 和 2,在第二次迭代中使用元素 2 和 3,依此类推。感谢您的回答
    猜你喜欢
    • 2014-08-11
    • 2020-01-05
    • 2022-09-17
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多