c++标准库的使用:
1.vector的使用:
1.1 vector向量容器:
底层数据结构:动态开辟的数组,每次以原来空间大小的2倍扩容。
容器中,对象的构造析构,内存的开辟释放,通过容器的空间配置器allocator来实现的
allocator类实现了内存分配与对象构造的分离,定义在头文件中分配的内存是原始的,未构造的
allocator<T>a:定义名为a的allocator对象,为类型T的对象分配内存
allocate(n):分配一段原始的,未构造的内存,保存n个T类型对象,返回类型是T的指针:T* p
deallocate(p,n):释放T*指针p中地址开始的n个内存,需要先调用destory函数析构对象
construct(p,args):p是T*类型的指针,指向原始内存,args传递给类型T的构造函数,来在p指向的内存中构造一个对象
destroy(p):对p指向的对象执行析构函数。
1.2 增加:
vec.push_back():末尾添加一个元素,复杂度O(1),可能导致容器扩容
vec.insert(it,20):it迭代器指向位置添加一个元素,复杂度O(n),可能导致容器扩容
1.3 删除:
vec.pop_back():末尾删除元素,O(1)
vec.erase(it):删除迭代器it指向的元素
1.4 查询:
operator[]:下标的随机访问运算符vec[5],复杂度O(1)
iter迭代器遍历
find,for_each,foreach:通过迭代器实现
1.5 常用方法:
size(),empty()
reserve(20):vector预留空间:只给容器底层开辟指定大小的内存空间,并不添加新元素
resize(20):容器扩容,不仅给容器底层开辟指定大小的内存空间,还会添加新的元素
swap:两个容器进行元素交换
1.6 注意:
对容器进行连续插入或删除操作(insert/erase)一定要更新迭代器(通过insert/erase函数的返回值更新迭代器),文章来源:https://www.toymoban.com/news/detail-498254.html
否则第一次insert/erase完成,迭代器就失效了。文章来源地址https://www.toymoban.com/news/detail-498254.html
1.7 实例程序:
#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char** argv){
vector<int>vec;
for(int i = 0; i < 20; ++i){
vec.push_back(rand()%100 + 1);
}
// 将vec中的偶数删除。
auto it = vec.begin();
while(it != vec.end()){
if(*it % 2 == 0){
it = vec.erase(it); // 使用vec.erase的返回值更新it,防止it失效。
}
else{
it++;
}
}
// 将偶数前添加一个数,数的值是:偶数-1
auto it1 = vec.begin();
for(;it1 != vec.end();it1++){
if(*it1 % 2 == 1){
it1 = vec.insert(it1,*it1-1);
it1++;
}
}
for(auto iv : vec){
cout << iv << " ";
}
cout << endl;
cout << "size = " << vec.size() << endl;
return 0;
}
探索reserv()函数和resize()函数:
vector<int>vec;
vec.reserve(20);
cout << "size = " << vec.size() << endl;
cout << "empty(): " << vec.empty() << endl;
for(int i = 0; i < 20; ++i){
vec.push_back(rand()%100 + 1);
}
cout << "size = " << vec.size() << endl;
cout << "empty(): " << vec.empty() << endl;
/*
size = 0
empty(): 1
size = 20
empty(): 0
*/
vector<int>vec;
vec.resize(20);
cout << "size = " << vec.size() << endl;
cout << "empty(): " << vec.empty() << endl;
for(int i = 0; i < 20; ++i){
vec.push_back(rand()%100 + 1);
}
cout << "size = " << vec.size() << endl;
cout << "empty(): " << vec.empty() << endl;
/*
size = 20
empty(): 0
size = 40
empty(): 0
*/
到了这里,关于vector 使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!