当前位置: 首页 > 知识库问答 >
问题:

使用for循环遍历C向量

严瑞
2023-03-14

我是C语言的新手。我已经开始使用向量,并且注意到在我看到的所有通过索引迭代向量的代码中,for循环的第一个参数总是基于向量的。Java我可能会使用ArrayList做这样的事情:

for(int i=0; i < vector.size(); i++){
   vector[i].doSomething();
}

我在C语言中看不到这一点有什么原因吗?是不好的做法吗?

共有3个答案

赫连瑾瑜
2023-03-14

有什么原因我在 C 中看不到这个吗?这是不好的做法吗?

不。这不是一个坏做法,但以下方法使您的代码具有一定的灵活性。

通常,在C 11之前,迭代容器元素的代码使用迭代器,例如:

std::vector<int>::iterator it = vector.begin();

这是因为它使代码更加灵活。

所有标准库容器都支持并提供迭代器。如果在稍后的开发点需要切换到另一个容器,那么不需要更改此代码。

注意:编写适用于所有可能的标准库容器的代码并不像看起来那么简单。

闾丘卓
2023-03-14

遍历向量的最干净的方法是通过迭代器:

for (auto it = begin (vector); it != end (vector); ++it) {
    it->doSomething ();
}

或者(相当于以上)

for (auto & element : vector) {
    element.doSomething ();
}

在C0x之前,必须用迭代器类型替换auto,并使用成员函数而不是全局函数begin和end。

这可能是您所看到的。与您提到的方法相比,其优点是您不太依赖向量的类型。如果您将向量更改为不同的“集合类型”类,您的代码可能仍然有效。然而,您也可以在Java中做类似的事情。概念上没有太大区别;然而,C使用模板来实现这一点(与Java中的泛型相比);因此,该方法将适用于定义了开始结束函数的所有类型,即使是非类类型,如静态数组。请参见此处:基于范围的for如何适用于普通数组?

司徒高寒
2023-03-14

你没有看到这样的实践的原因是非常主观的,不能有一个明确的答案,因为我已经看到了许多使用你提到的方式而不是迭代器风格代码的代码

以下可能是人们不考虑vector.size()循环方式的原因:

  1. 对于每次在循环条件下调用size()都很偏执。但是,这不是问题,也可以简单地解决
  2. 对于循环本身,首选std::for_each()而不是
  3. 稍后将容器从std::vector更改为其他容器(例如映射 >)也会要求更改循环机制,因为不是每个容器都支持

C 11 为通过容器提供了良好的设施。这被称为“基于范围的 for loop”(或 Java 中的“增强的 for loop”)。

只需很少的代码,您就可以遍历整个(强制!)std::向量

vector<int> vi;
...
for(int i : vi) 
  cout << "i = " << i << endl;

 类似资料:
  • 问题内容: 以下代码使我有些困惑: 我不明白的是那key部分。Python如何识别它只需要从字典中读取密钥?是中的特殊字?还是仅仅是一个变量? 问题答案: 5174 只是一个变量名。 只会循环遍历字典中的键,而不是键和值。要遍历键和值,可以使用以下命令: 对于Python 3.x: 对于Python 2.x: 要测试自己,请将单词更改key为poop。 在替换为,它返回由dict支持的类似set的

  • 问题内容: 以下是提供输出的代码段:。由于访问列表中的数字3,我期望获得输出。在线给出的解释是“每次迭代中更改的价值”,但我不太了解如何或为什么。任何解释都很好! 问题答案: 这里发生的是一个列表在循环过程中发生了变异。 让我们考虑以下代码片段: 输出为: 每次迭代: 从内部指针当前指向的位置读取值 立即将其分配给列表中的最后一个元素 在最后一个元素打印在标准输出上之后 就像这样: 内部指针指向第

  • 问题内容: 通常我们这样编码: 但是也可以按照以下方式做一些事情: 我想要这样做的真正原因是因为我想使用python-progressbar的自动检测maxval。他们喜欢 问题答案: 您可以与callable一起使用。(您应该传递两个参数,一个用于可调用对象,另一个用于前哨值) 注意 当没有剩余元素并且没有放置哨兵值时,它将阻塞。另外,就像-循环,并且与普通的容器循环不同,它将从队列中删除项目。

  • 需要帮助通过简单的HTML DOM解析器遍历DOM树。如果有人能花点时间来看看它是如何工作的,那么如果我能理解的话,知识渊博的PHP程序员应该能很快理解它。我陷入困境的地方是从我朋友的俄罗斯篮球网站上的一个部门那里得到文章。例如,以下是博客div的外观: 这就是我如何拉出单个“a”链接并显示它们的方法,但我想做的是获取所有链接的div标题,基本上对它们进行分类,而不是将所有内容都排成一行。我不知道

  • 我得到一个使用下面的代码的锚的列表,然后我想去每个链接。我想出了下面的代码,但是在第一个循环之后,我得到了以下异常 org.openqa.selenium.staleElementReferenceException:过时元素引用:元素未附加到页面文档(会话信息:Chrome=55.0.2883.87) 有没有办法做到这一点,而不需要每次返回页面?

  • 本文向大家介绍C#使用foreach循环遍历数组完整实例,包括了C#使用foreach循环遍历数组完整实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用foreach循环遍历数组的方法。分享给大家供大家参考,具体如下: 更多关于C#相关内容感兴趣的读者可查看本站专题:《C#遍历算法与技巧总结》、《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件