gpt4 book ai didi

c++ - C++ 11遍历 vector 的新方法?

转载 作者:行者123 更新时间:2023-12-02 10:00:33 27 4
gpt4 key购买 nike

我有一个 vector ,并像这样迭代它:

for (int i=0,num_of_roads=roads.size();i<num_of_roads;++i)
{
roads[i]//...
}
但是我看到一些写道:
for (Road road:roads)
{
road//...
}
有人可以解释有什么区别吗?他们会给出相同的结果

最佳答案

第一个是自开始以来就一直在C / C++中运行的简单循环。第二个称为 range-for 循环。可以将它用作与传统for循环等效的可读性更高的for循环,在一定范围的值(例如容器中的所有元素)上进行操作。
语法:

for(declaration : expression)
for-range循环的每次迭代都会创建局部变量x并将其初始化为vector的下一个元素。一旦到达 vector.end(),循环将结束。
range-for循环的简单语法是- for (auto road: roads)。但是请注意,这将创建元素对象的副本。因此您将无法修改原点 vector 的元素
在这种情况下,如果只想访问方法而不修改元素,则应使用这种语法- for (const auto& road : roads)。首先,这将防止复制对象,然后还有助于防止对元素的任何意外修改。

差异-
  • 第一个明显的不同是,您可以在简单的for循环中访问元素索引。但是,在range-for循环中,您将无法访问element的索引。因此,与正常的for循环(如arr[i+1]arr[i-2]等)不同,您将无法在成功访问当前元素之前访问元素。
  • 如果您要遍历整个 vector 以进行读取,则range-for可能会更好。 range-for循环以这种方式进行了优化。他们只计算一次精加工条件。 Range-for仅取消引用迭代器一次,以检查结束条件。因此,标准保证了当您要遍历整个 vector (尤其是出于读取目的)时,可以实现最佳性能
  • 在正常的for循环中,您将通过元素的索引访问元素本身,但是如果选择将range-for循环用作-for(auto elem:vec),则此操作将创建vector的每个元素的副本。如果 vector 的元素是复杂的对象,这可能会很昂贵。我们可以通过使用如上所述的for(auto& elem:vec)来防止这种情况。

  • 每当您只想遍历vector而不需要索引时,都应使用 range-进行循环。当您只想读取 vector 元素值并且 vector 由复杂数据类型组成时,它将特别有用。当您只想读取 vector 时,可以使用const reference。如果要将对象修改为 for(auto& elem:vec),可以使用非常量引用。 (理想情况下,出于性能考虑,最好使用引用)
    这将有助于提高可读性,并使代码保持简单。另外,您也不会看到任何性能下降的情况(在某些情况下,会略有提高),因此我们也不必担心。
    您可以阅读有关它的更多信息 here

    关于c++ - C++ 11遍历 vector 的新方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62704193/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com