代码之家  ›  专栏  ›  技术社区  ›  TheEagle

根据迭代器的顺序向前或向后迭代

  •  -1
  • TheEagle  · 技术社区  · 1 年前

    我有一个 std::vector 有条目,还有两个条目 a b 它们保证在该向量中。我在用 std::find 获取迭代器 aIt bIt 在向量中 b 但我不知道是哪一个 b 在向量中排名第一。现在我想对来自的所有条目做点什么 b ,为此我需要迭代 b 不管这两者的顺序如何。如何做到这一点?

    如果满足以下条件,传统的迭代器比较将不起作用 来了之后 b 在向量中:

    
    std::vector<int> vec = {1, 2, 3, 4, 5};
    int a = 5;
    int b = 2;
    auto aIt = std::find(vec.begin(), vec.end(), a);
    auto bIt = std::find(vec.begin(), vec.end(), b);
    for (; aIt != bIt; aIt++) {
      std::cout << *aIt << std::endl;
    }
    

    输出:

    5
    0
    1041
    0
    825494064
    909128761
    2609
    0
    0
    0
    0
    0
    [...]
    0
    0
    0
    0
    Segmentation fault (core dumped)
    
    3 回复  |  直到 1 年前
        1
  •  4
  •   Unmitigated    1 年前

    您可以使用 std::minmax 结合 std::ranges::subrange (而不是手动推进迭代器)。

    #include <vector>
    #include <ranges>
    #include <algorithm>
    #include <iostream>
    int main() {
        std::vector vec{1, 2, 3, 4, 5};
        int a = 5, b = 2;
        auto [startIt, endIt] = std::minmax(std::ranges::find(vec, a), std::ranges::find(vec, b));
        for (const auto& x : std::ranges::subrange(startIt, endIt))
            std::cout << x << '\n';
    }
    
        2
  •  3
  •   3CxEZiVlQ    1 年前

    如果 ---a---b--- 然后 bIt 不是 vec.end() .如果 ---b---a--- 然后 bIt vec.end() bIt 得到 aIt 搜索 b ,适用于任何容器:

    auto aIt = std::find(vec.begin(), vec.end(), a);
    auto bIt = std::find(aIt, vec.end(), b);
    if (bIt == vec.end())
      bIt = std::exchange(aIt, std::find(vec.begin(), aIt, b));
    
        3
  •  2
  •   Bill Lynch    1 年前

    因为你正在使用 std::vector ,你可以比较一下 aIt bIt 如果它们坏了,就换掉。

    if (aIt > bIt)
      std::swap(aIt, bIt);
    for (; aIt != bIt; aIt++) {
      std::cout << *aIt << std::endl;