繁体   English   中英

使用循环 c++ 迭代向量

[英]Iterate over vector using loop c++

假设我有一个 long long 元素的向量:

std::vector<long long>V {1, 2, 3};

我已经看到,为了迭代向量,你可以这样做:

for (auto i = v.begin() ; i != v.end() ; i++)
   cout<<*i;

i++意味着i增长1 ,但地址 go 不应该增加 8 个字节来打印下一个元素吗? 所以 for 循环的“增长”部分(对于任何类型)应该如下所示:

i += sizeof(v[0]);

我假设一个地址可以容纳 1 个字节,所以如果 integer 的起始地址是 1000,那么它的总分配将由地址表示:1000、1001、1002、1003。我想更好地理解 ZCD69B4957F06CD81817BF3D619ZE如果你能帮助我将不胜感激。

当您增加指针时,它会增加指针类型的“大小”。 请记住,对于给定的指针ii[0]是第一个元素,等效于*(i + 1)

迭代器倾向于以非常相似的方式工作,因此它们的操作很熟悉,由于operator*operator->的实现方式,它们感觉就像是指针。

换句话说, i++的含义完全取决于i是什么以及operator++将对该类型做什么。 看到++并不自动意味着+1 对于迭代器,它具有非常特定的含义,这完全取决于类型。

对于std::vector ,它将指针向上移动到下一个条目。 对于其他结构,它可能会导航链接列表。 您可以编写自己的 class 进行数据库调用,从磁盘读取文件,或者基本上任何您想要的。

现在,如果您执行i += sizeof(v[0]) ,那么您将在数组中向上移动任意数量的位置。 这取决于该条目的大小,这在很大程度上取决于您的ISA

std::vector非常简单,它只是一个像数组一样处理的 memory 的直线块。 您甚至可以通过data() function 获得指向它的指针。

换句话说,将i++视为“上移一个索引”而不是“上移一个字节”。

您编写此代码的方式的好处之一是您无需担心字节。

您的i auto类型掩盖了它是向量迭代器的事实,换句话说,是一种特殊类型,旨在访问long long向量的成员。 这意味着*i评估为从向量i当前正在索引的任何成员中提取的long long ,因此i++推进i以索引向量的下一个成员。

现在,就低级实现而言,值1, 2, 3可能位于 memory 的相邻 8 字节块中,并且i可能实现为指针,递增i可能通过将其值加 8 来实现,但是这些假设中的每一个都将取决于您的架构和编译器的实现。 正如我所说,这可能是您无需担心的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM