[英]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如果你能帮助我将不胜感激。
当您增加指针时,它会增加指针类型的“大小”。 请记住,对于给定的指针i
, i[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.