vector

Posted zhiminzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
}

 

以上是关于vector的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的时间复杂度是多少?

为什么std :: foreach不能用于std :: vector ? [重复]

如何将浮点矩阵作为 2D 纹理传递给片段着色器?

Jax 矢量化:vmap 和/或 numpy.vectorize?

光照 法向量(Normal Vector)

光照 法向量(Normal Vector)