如何使用自动 for 循环来替代嵌套 for 循环?

Hem*_*ava 4 c++ algorithm for-loop std auto

我想知道 C++ 中是否有一些可用的东西可以帮助我们在使用auto. 比如说,我想将一个数组元素与所有其他元素进行比较。我们传统上是这样做的:

std::vector<int> vec {1, 2, 3, 4};

for (int i = 0; i < vec.size(); ++i) 
{
    for (int j = i + 1; j < vec.size(); ++j) 
    {
        if (vec[i] == vec[j]) {}
        // Compares 1 with 2, 3 and 4
        // Compares 2 with 3 and 4
    }
}
Run Code Online (Sandbox Code Playgroud)

目的是auto为了达到这个目的而使用。

std::vector<int> vec{1, 2, 3, 4};

for (<auto>& i : vec)
//   ^^^^^^^
{
    // What should I write here so that I compare only the forward elements?
}
Run Code Online (Sandbox Code Playgroud)

我们或许可以使用这样的东西:

for (auto it = vec.begin(); it != vec.end(); ++it)
{
    for (auto jt = it + 1; jt != vec.end(); ++jt) 
    {
        // Do a comparison here.
    }
}
Run Code Online (Sandbox Code Playgroud)

第三个快照再次写入更多代码。我希望对普通的第二个快照有更多的了解。

问题本身提到过。

JeJ*_*eJo 5

我想知道 C++ 中是否有一些可用的东西可以帮助我们在使用auto.

不完全是你想要的;但是,使用std::ranges::iota_view(Since ),您可以编写基于范围的嵌套for循环,如下所示:

#include <ranges> // std::ranges::iota_view

for (const auto i : std::views::iota(0u, std::size(vec)))
{
    for (const auto j : std::views::iota(i + 1u, std::size(vec)))
    {
        if (vec[i] == vec[j])
        {
            // .....
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 godbolt.org 中观看现场演示

此外,这使您能够拥有ij超出const循环范围。


旁注:对于早于 C++20 的编译器,可以轻松实现一个与std::ranges::iota_view.