gpt4 book ai didi

c++ - C++ vector 迭代器与指针

转载 作者:行者123 更新时间:2023-12-03 22:36:38 25 4
gpt4 key购买 nike

处理 vector 元素的方法有很多。

我可以这样使用指针:

vector<int> v = {10, 11, 12};
int *p = &v[0];
cout << *p; //Outputs "10"

我也可以这样使用指针:
vector<int> v = {10, 11, 12};
vector<int>::pointer p = v.data();
cout << *p; //Outputs "10"

我也可以使用迭代器类型:
vector<int> v = {10, 11, 12};
vector<int>::iterator i = v.begin();
cout << *i; //Outputs "10"

我在这里缺少什么明显的区别吗?

最佳答案

就能够执行手头的任务而言,它们都表现良好。毕竟,它们都提供了一个满足迭代器要求的对象,并且您正在使用它们指向vector的相同元素。 但是,我会选择vector<int>::iterator选项,因为该类型更能表达我们打算如何使用它。

原始指针类型int*告诉您什么是p,只是它存储了int的地址。如果您单独考虑p,它的类型不会告诉您如何使用它。 vector<int>::pointer选项具有相同的问题-它只是将其指向的对象的类型表示为 vector 的元素类型。它实际上没有必要指向vector

另一方面,vector<int>::iterator告诉您所有您需要了解的内容。它明确声明该对象是一个迭代器,并且该迭代器用于指向vector<int>中的元素。

如果碰巧更改了容器类型,这还具有易于维护的优点。例如,如果更改为std::list,则指针类型将不再起作用,因为元素未存储为连续数组。容器的iterator类型始终为您提供可用于迭代其元素的类型。

当我们有了Concepts时,我希望最佳实践是这样的:

ForwardIteratorOf<int> it = std::begin(v);

哪里 ForwardIteratorOf<int>(我想像中存在)更改为最能描述您对 it意图的概念。如果元素的类型无关紧要,则只需 ForwardIterator(或 BidirectionalIteratorRandomAccessIterator或其他)。

关于c++ - C++ vector 迭代器与指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25393431/

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