vector<int>::iterator mid=(vi.begin()+vi.end())/2

本文探讨了C++中使用迭代器进行算法操作的方法,重点解释了如何正确地使用迭代器来计算中间元素,并指出了使用错误方法可能导致的编译错误。

C++ Primer第四版 P88

如果采用下面的计算方法来计算mid会产生什么结果?

正确方法:

//用迭代器算术操作,初始化mid,使其指向vi中最靠近正中间的元素
vector<int>::iterator mid=vi.begin()+vi.size()/2;


错误方法:

//如采用下面的方法来计算mid
vector<int>::iterator mid=(vi.begin()+vi.end())/2
//将两个迭代器相加的操作是未定义的,因此用这种方法计算mid会出现编译错误 
vi.begin()与vi.end()返回的是迭代器。vi.size()返回的是元素个数。

迭代器的算法操作:

iter + n     //产生一个新的迭代器
iter - n      //产生一个新的迭代器
iter1 - iter2  //计算2个迭代器的距离



`vector<int>::iterator it = vi.begin()` 是 C++ 中用于操作 `vector` 容器的代码语句。下面从含义、用法和注意事项几个方面进行详细说明: ### 含义 `vector<int>::iterator` 定义了一种迭代器类型。在 C++ 里,每种容器类型都有自己的迭代器类型,`vector<int>::iterator` 就是 `vector<int>` 容器专门定义的迭代器类型。`vi` 是一个 `vector<int>` 类型的容器对象,`vi.begin()` 这个函数会返回一个迭代器,此迭代器指向 `vi` 容器的第一个元素。所以,`vector<int>::iterator it = vi.begin()` 这句话的作用是声明一个名为 `it` 的迭代器对象,并且让它指向 `vi` 容器的第一个元素[^2][^4]。 ### 用法 #### 遍历容器元素 借助迭代器 `it` 能够遍历 `vi` 容器里的所有元素。示例代码如下: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vi = {1, 2, 3, 4, 5}; std::vector<int>::iterator it = vi.begin(); for (; it != vi.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; } ``` 在上述代码中,通过 `it` 迭代器遍历 `vi` 容器,利用 `*it` 来访问迭代器所指向的元素,直至 `it` 等于 `vi.end()`(`vi.end()` 返回的迭代器指向容器最后一个元素的下一个位置)[^2]。 #### 修改容器元素 迭代器 `it` 不仅能读取容器元素,还可以修改元素的值。示例代码如下: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vi = {1, 2, 3, 4, 5}; std::vector<int>::iterator it = vi.begin(); for (; it != vi.end(); ++it) { *it = *it * 2; } for (it = vi.begin(); it != vi.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; } ``` 在上述代码中,使用 `*it = *it * 2` 把容器中每个元素的值都乘以 2,实现元素的修改[^2]。 ### 注意事项 - **迭代器失效**:当对容器进行插入或删除操作时,可能会导致迭代器失效。比如,在使用迭代器遍历容器时进行插入操作,可能会使迭代器指向的元素位置发生改变,从而引发程序出错。 - **常量迭代器**:如果不需要修改容器中的元素,建议使用 `const_iterator` 类型的迭代器,以避免意外修改元素。示例代码如下: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vi = {1, 2, 3, 4, 5}; std::vector<int>::const_iterator cit = vi.begin(); for (; cit != vi.end(); ++cit) { std::cout << *cit << " "; // *cit = 10; // 错误,不能修改常量迭代器指向的元素 } std::cout << std::endl; return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值