STL典型使用--vector类模板

版权声明:原创文章,请持怀疑态度阅读,欢迎转载,但请注明文章出处。 https://blog.csdn.net/qq_29344757/article/details/82825113

vector是将元素放在一个动态数组中加以管理的容器,vector可以随机存取元素(用[]操作符或at()直接存取),也支持迭代器存取元素;vector在尾部添加或移除元素十分高效,但是在中间或者头部插入/移除元素会比较费时。

1. 增加/删除vector内的元素

vector采用类模板实现,从而实现了算法和数据类型的分离,因此vector可以存放任何类型的元素(一个vector里的元素只能是一种):

vector<int> intVec;		//一个存放int的vector容器

class TT {};
vector<TT> vecTT;		//一个存放TT对象的vector容器
vector<TT*> vecTTAddr;	//一个存放TT对象地址的vector容器

需要注意,容器元素存放是按值复制的方式进行的,所以TT类必须提高TT的拷贝构造函数,以保证TT对象间拷贝正常。

示例1:

std::vector<int> intVec;

for (int i = 0; i < 5; ++i) {
	intVec.push_back(i + 1);	//尾插元素值
}

intVec.front() = 128;	//修改头部数据,front()返回的是头部元素的引用
intVec.back() = 666;	//修改尾部数据,back()返回的是尾部元素的引用

while (intVec.size() > 0) {
	std::cout << intVec.back() << std::endl;
	intVec.pop_back();	//删除尾部元素
}

vector有如下带参构造函数:

vector(beg, end);			//构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开区间
vector(n, elem);			//构造函数将n个elem拷贝给本身
vector(const vector& vec);	//拷贝构造函数
int arr[] = {0, 1, 2, 3, 4};
std::vector<int> int_vec1(arr, arr + 5);

std::vector<int> int_vec2(int_vec1.begin(),int_vec1.end());
std::vector<int> int_vec3(int_vec1.begin(), int_vec1.begin() + 3);
std::vector<int> int_vec4(3, 9);

std::vector<int> int_vec5 = int_vec1;

2. vector的[]的下标操作符

需要注意,进行[]操作之前要保证该地址已分配内存
示例1:

std::vector<int> v1(10);	//分配10个int的空间,其初始值为0

for (int i = 0; i < 10; ++i) {
	v1[i] = i * 2;
}

for (int i = 0; i < 10; ++i) {
	printf("%d\n", v1[1]);
}

3. vector的迭代器

迭代器是一个可遍历STL容器内全部或者部分元素的对象,它如同一个指针,指出容器中的一个特定位置。迭代器提供对容器中的对象的访问方法,并且可以定义了容器中对象的范围。
示例:

//正序遍历
for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ++it) {
	std::cout << *it << std::endl;
}

//逆序遍历,.rbegin()等价于.end()
for (std::vector<int>::reverse_iterator rit = v1.rbegin(); rit != v1.rend(); ++rit) {
	std::cout << *rit << std::endl;
}

迭代器由只读/非只读、正序/逆序组合如下4种:

typedef __gnu_cxx::__normal_iterator<pointer, vector>	iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator;
typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
typedef std::reverse_iterator<iterator>	reverse_iterator;

4. vector的插入和删除

v1.clear();						//移除容器中所有数据
v1.erase(v1.begin(), v1.end());	//删除[begin(), end())区间的数据,返回下一个数据的位置
v1.erase(pos);					//删除pos位置的数据,返回下一个数据的位置

示例:

for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ) {
	if (*it == 6) {
		it = v1.erator(it);	//删除迭代器所指的元素时,该函数会自加it并且返回,所以for()循环中不能++it
	}
	else {
		++it;
	}
}

元素插入:

v1.insert(pos, elem);			//在pos位置插入一个elem元素的拷贝,返回新数据的位置
v1.insert(pos, n, elem);		//在pos位置插入n个elem元素的拷贝,无返回值
v1.insert(pos, begin(), end());	//在pos位置插入[begin(), end())区间的数据,无返回值

猜你喜欢

转载自blog.csdn.net/qq_29344757/article/details/82825113