vector

1、越界检查
a[2] 数组不会检查越界,vector会检查越界

2、容器中不能存放引用
vector, vector<int*>,
vector<int&>(这种情况不可以) 引用是个别名,不是对象,不是对象不能往vector中放

3、比较少见的几种创建方式
vector a(5, -1); // 初始化,其中是5个int 每个元素都是-1
vector a(5); // 其中的5 只是表示该容器中元素的个数,而不是其中的值为5

4、迭代器

(1)常见迭代器

vector::iterator            // 普通迭代器,可以读写
vector::const_iterator   //常量迭代器,所指的内容不能通过该迭代器修改
begin()     // 返回指向第一个元素的迭代器 end() 返回指向最后一个元素后的一个不存在的元素的迭代器,相当于一种结束标志
rbegin()   //返回指向最后一个元素的迭代器 rend() 返回指向第一个元素前的一个不存在的元素的迭代器,相当于一种结束标志
cbegin()/cend()   // 作用与 begin()/end() 相同,只是返回的是常亮迭代器

(2)vector的插入

vector vct = {1, 2, 3, 4, 5};
auto itor = std::find(vct.begin(), vct.end(), 3);
vct.insert(itor, 100); // 将100 插入到3 之前

(3)vector元素的删除

vct.erase(itor); // 删除itor所指向的元素,同时返回指向被删除元素后一个元素的迭代器
//所以逐个删除vector容器中元素时候,不能用for循环,错误示例:
for (auto iter = vct.begin(); iter != vct.end(); ++iter)
{
    vct.erase(iter);
}
// 而应该用while 循环,正确示例:
auto iter = vct.begin();
while (iter != vct.end())
{
    iter = vct.erase(iter);
}

(4)vector 中的内存释放

//如果容器中的指针对象是自己new出来的,在用完该容器的时候,需要自己释放容器中new出来的内存,用迭代器释放
vector<IElement > vct;   // 假定IElement为自定义类
IElement pElement = new IElement();
vct.push_back(pElement);
for (auto iter = vct.begin(); iter != vct.end(); ++iter)
{
    delete (*iter);
}

 5、vector的元素个数和内存空间

    vector<int> vct;
    cout << vct.size() << endl;       // 元素个数
    cout << vct.capacity() << endl;   // 目前的内存空间大小,超过该空间,添加元素,会重新分配新的内存
    vct.reserve(10);   // 提前预留10个元素内存空间,但是并没有元素   
    vct.resize(5);     // 初始化5个为0 的元素

 

posted @ 2020-06-07 12:26  min_zhi  阅读(370)  评论(0编辑  收藏  举报