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)
第三个快照再次写入更多代码。我希望对普通的第二个快照有更多的了解。
问题本身提到过。
我想知道 C++ 中是否有一些可用的东西可以帮助我们在使用
auto.
不完全是你想要的;但是,使用std::ranges::iota_view(Since c++20 ),您可以编写基于范围的嵌套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)
此外,这使您能够拥有i并j超出const循环范围。
旁注:对于早于 C++20 的编译器,可以轻松实现一个与std::ranges::iota_view.