c++ vector用法和迭代器

本文详细介绍了C++中vector容器的使用方法,包括创建、初始化、增删查改等操作,并提供了实例说明。此外,还讲解了迭代器的基本使用方法及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结。

(1)头文件#include<vector>.

(2)创建vector对象,vector<int> vec;

(3)初始化vector对象,vector<T> v1;  类型为T的默认初始化

                                   vector<T> v2(n,val); v2中包含了n个类型为T值为val的元素

                                   vector<T> v3{  a, b, c ...  }; 列表初始化 

 注:vector<int> v1{10,1}; v1有两个 元素 0和1

        vector<int> v2(10,1); v2有十个元素,每个都是1

(4)尾部插入元素:vec.push_back(a);

(5)插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;

(6)使用下标访问元素,cout<<vec[0]<<endl;但是不能直接赋值,vec[0]=1//!!严重错误。

(7)删除元素:    vec.erase(vec.begin()+2);删除第3个元素

                         vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始

(8)向量大小:      vec.size();

(9)清空:             vec.clear();

 

(10)使用sort排序:需要头文件#include<algorithm>,

      sort(vec.begin(),vec.end());(默认是按升序排列,即从小到大).

      可以通过重写排序比较函数按照降序比较,如下:

      bool Comp(const int &a,const int &b)
   {
    return a>b;
   }
    调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。


2. 迭代器比下标运算符更通用,所有标准库容器都可以使用迭代器。(string对象不属于容器类型,但同样支持)

(1) 迭代器访问元素

 使用begin成员返回指向第一个元素,end指向尾元素的下一位置。(即并不存在的尾后元素)

string s("some string");
for(auto it=s.begin();it!=s.end()&&!isspace(*it);++it)
  *it=toupper(*it)//当前字符改成大写形式

(2) 解引用获得所指对象  

 

  (*it).empty; //检查所指字符串是否为空

(3) 箭头运算符->

  it->empty();

(4)使用迭代器的循环体,不能向迭代器所属容器添加元素。(终止条件失效)

(5)使用迭代器进行二分搜索

 

#include <vector>
#include <iostream>
using namespace std;
int main()
{
	vector<int> text{1,2,3,4,5,6,7,8,9,10};
	int sought;
	cin>>sought;
	//迭代器二分搜索,text必须有序
	auto beg=text.begin(),end=text.end();
	auto mid=beg+(end-beg)/2;
	while(mid!=end&&*mid!=sought){
		if(sought<*mid)
			end=mid;
		else
			beg=mid+1;
		mid=beg+(end-beg)/2;
	}
	if(mid==end)
		cout<<"not found.\n";
	else
		cout<<*mid<<" is found.\n";
	return 0;
}


 

转载于:https://www.cnblogs.com/yueshangzuo/p/5889907.html

<think>我们被要求回答关于C++ vector容器迭代器使用方法的问题。根据引用资料,我们可以总结如下: 1. 迭代器是一种检查容器内元素并遍历元素的数据类型(引用[1])。 2. 迭代器的基本操作包括:获取开始迭代器(begin())结束迭代器(end()),其中end()指向最后一个元素的下一个位置(引用[4])。 3. 迭代器支持类似指针的操作,如解引用(*it)来访问元素,递增(++it)来移动到下一个元素(引用[3],[4])。 4. 使用迭代器遍历vector是常见做法(引用[4]提供了两种遍历方式:迭代器遍历下标遍历)。 5. 注意:初始化空的vector容器时,不能使用迭代器进行赋值操作(引用[2]示例),因为begin()end()相等,循环不会执行。 下面我们按照用户要求,用清晰的结构回答,并生成相关问题。 ### 回答 C++中的vector容器是标准模板库(STL)中的一种序列容器,它支持动态数组的功能。迭代器是访问遍历vector容器中元素的重要工具。下面详细介绍vector迭代器的使用方法: 1. **迭代器的类型** vector迭代器的类型为`std::vector<T>::iterator`(正向迭代器`std::vector<T>::const_iterator`(常量正向迭代器,用于只读访问)。此外,还有反向迭代器(`reverse_iterator``const_reverse_iterator`)用于从后向前遍历。 2. **获取迭代器** - `begin()`: 返回指向第一个元素的迭代器。 - `end()`: 返回指向最后一个元素之后位置的迭代器(尾后迭代器)。 - `cbegin()`, `cend()`: 返回常量迭代器C++11起)。 - `rbegin()`, `rend()`: 返回反向迭代器。 - `crbegin()`, `crend()`: 返回常量反向迭代器C++11起)。 示例: ```cpp std::vector<int> vec = {1, 2, 3}; // 正向迭代器 std::vector<int>::iterator it_begin = vec.begin(); std::vector<int>::iterator it_end = vec.end(); // 常量迭代器 auto cit_begin = vec.cbegin(); // 自动类型推导 ``` 3. **使用迭代器遍历vector** 通常使用循环遍历,注意结束条件是迭代器不等于`end()`。 ```cpp for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; // 解引用迭代器获取元素 } // 或者使用C++11范围for循环(底层也是迭代器) for (auto elem : vec) { std::cout << elem << " "; } ``` 4. **迭代器的操作** 迭代器支持以下操作: - 递增(`++it`):移动到下一个元素。 - 递减(`--it`):移动到上一个元素(仅双向迭代器vector迭代器是随机访问迭代器,支持递减)。 - 解引用(`*it`):获取迭代器指向元素的引用。 - 成员访问(`it->member`):如果元素是对象,可以通过`->`访问其成员。 - 算术运算:如`it + n`, `it - n`(随机访问迭代器的特性)。 - 比较:`==`, `!=`, `<`, `>`等(用于判断位置关系)。 示例: ```cpp std::vector<int> vec(10, 1); // 10个1 auto it = vec.begin(); it += 5; // 移动到第6个元素(下标5) *it = 10; // 修改元素 ``` 5. **注意事项** - 不要对空容器使用迭代器(除`begin()``end()`相等外,解引用空容器的迭代器是未定义行为)。 - 迭代器失效:当vector发生插入或删除操作时,可能导致迭代器失效(如扩容会使所有迭代器失效)。因此,在修改vector后,不要使用旧的迭代器。 - 初始化空vector时,不能通过迭代器赋值(如引用[2]中的错误示例)。应使用`push_back()`或`resize()`等方法添加元素。 6. **迭代器与算法** STL中的许多算法(如`std::sort`, `std::find`)都使用迭代器作为参数。例如: ```cpp #include <algorithm> std::vector<int> vec = {3, 1, 4, 1, 5}; std::sort(vec.begin(), vec.end()); // 排序 auto it = std::find(vec.begin(), vec.end(), 4); // 查找元素4 if (it != vec.end()) { std::cout << "Found at position: " << (it - vec.begin()) << std::endl; } ``` 7. **迭代器与嵌套容器** 当vector的元素也是容器时,迭代器的类型会变得复杂。例如: ```cpp std::vector<std::vector<int>> matrix; // 遍历二维vector for (auto row_it = matrix.begin(); row_it != matrix.end(); ++row_it) { for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) { std::cout << *col_it << " "; } } ``` 通过以上介绍,您应该对vector容器的迭代器使用方法有了基本了解。在实际编程中,推荐使用迭代器来访问操作vector元素,因为它更通用且符合STL的设计哲学。 §§相关问题§§ 1. vector迭代器失效的场景有哪些?如何避免? 2. 如何实现vector迭代器的自定义排序? 3. vector迭代器数组指针有什么区别联系? 4. 在C++11及更高版本中,如何使用基于范围的for循环简化迭代器遍历? 5. 如何利用迭代器实现vector的插入删除操作?</think>### C++ vector容器迭代器使用方法详解 在C++中,vector容器的迭代器是一种智能指针,用于访问遍历容器中的元素。以下是核心使用方法: #### 1. **迭代器基本操作** ```cpp #include <vector> #include <iostream> int main() { std::vector<int> vec = {10, 20, 30}; // 声明迭代器(注意类型匹配) std::vector<int>::iterator it; // 遍历容器 for (it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; // 解引用访问元素 } // 输出:10 20 30 } ``` - **`begin()`**:返回指向第一个元素的迭代器 - **`end()`**:返回指向**最后一个元素之后位置**的迭代器(尾后迭代器) - **`++it`**:移动到下一个元素(推荐前置递增) #### 2. **迭代器操作类型** | 操作 | 示例 | 说明 | |---------------|-----------------------|--------------------------| | 解引用 | `*it = 50;` | 修改元素值 | | 成员访问 | `it->member` | 访问元素成员(对象时) | | 算术运算 | `it + 3` | 向后移动3个位置 | | 比较 | `it1 != it2` | 判断是否指向不同位置 | | 距离计算 | `auto dist = it2 - it1;` | 元素间距(`difference_type`)[^5] | #### 3. **常量迭代器** ```cpp const std::vector<int> cvec = {1, 2, 3}; std::vector<int>::const_iterator cit; for (cit = cvec.cbegin(); cit != cvec.cend(); ++cit) { // *cit = 5; // 错误!常量迭代器禁止修改元素 } ``` - **`cbegin()/cend()`**:返回只读迭代器C++11起) #### 4. **关键注意事项** 1. **空容器处理** 空容器的`begin() == end()`,遍历时循环不会执行[^2]: ```cpp std::vector<int> emptyVec; if (emptyVec.begin() == emptyVec.end()) { std::cout << "容器为空!"; } ``` 2. **迭代器失效场景**(重要!) 以下操作会使迭代器失效: - 插入元素导致**容量重分配**(所有迭代器失效) - 在`it`位置插入/删除元素(`it`及之后的迭代器失效) ```cpp std::vector<int> v = {1,2,3}; auto it = v.begin() + 1; v.push_back(4); // 可能引起重分配,it失效! ``` 3. **安全遍历建议** ```cpp // 推荐方式:使用!=而非<比较 for (auto it = vec.begin(); it != vec.end(); /* 递增在循环内处理 */) { if (*it % 2 == 0) { it = vec.erase(it); // erase返回下一个有效迭代器 } else { ++it; } } ``` #### 5. **实际应用场景** 1. **与STL算法结合** ```cpp #include <algorithm> // 查找元素 auto pos = std::find(vec.begin(), vec.end(), 20); if (pos != vec.end()) std::cout << "找到元素"; ``` 2. **嵌套容器访问** ```cpp std::vector<std::vector<int>> matrix = {{1,2}, {3,4}}; for (auto row_it = matrix.begin(); row_it != matrix.end(); ++row_it) { for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) { std::cout << *col_it << " "; } } ``` #### 6. **迭代器 vs 下标访问** | 特性 | 迭代器 | 下标 | |--------------|----------------------------|--------------------| | 通用性 | 所有STL容器支持 | 仅vector/deque支持 | | 安全性 | 可检测越界(`.at()`类似) | 越界未定义行为 | | 算法兼容性 | 直接适配STL算法 | 需转换 | | 性能 | 与指针效率相当 | 相同 | > **最佳实践**:优先使用迭代器,使代码更通用且符合STL设计哲学[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值