vector 使用

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函数的返回值更新迭代器),

​ 否则第一次insert/erase完成,迭代器就失效了。

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
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值