数据结构之vector
vector是c++中的一种序列式容器,依靠其下标索引来访问获取容器内容。
vector和array同为序列式容器,其数据格式、操作等方面都十分相似,其最大不同点在于它们对于内存空间的使用。array是静态数组,使用者必须把握好其数据数量,一次性分配合理的内存空间。否则array会在添加新元素而空间不足时,其内存会经历寻找更大的空间,复制到新空间,销毁旧空间。这对内存的使用是非常不好的,而且效率低下。而vector是动态数组,在添加新元素而旧空间不够时虽然也会进行三个步骤,但系统进行了重新配置空间和数据移动的优化,其效率和安全性是比array高很多的。
vector的数据结构:
vector的底层是连续线性空间。它常使用两个迭代器,begin(连续空间的第一个元素位置)和end(超出元素末尾的第一个元素位置),常用这两个来表示已使用的空间范围。还有一个end_of_storage,表示其vector容器的整个空间末尾的元素位置。
vector的内存分配:
标准库是以最小的代价来连续储存元素。为了vector能实现快速的内存分配,其实际分配的会略多于当前所需的,即是end到end_of_storage。当这一段也用光,再有新元素加入的时候,会分配当前两倍的空间。这个内存再扩大的过程会经历寻找新空间、移动复制、释放旧内存的三步曲,这样会扩容之前的迭代器失效。
vector使用:
std::vector vec; vec.clear() 移除容器中所有数据。 vec.empty() 判断容器是否为空。 vec.erase(pos) 删除pos位置的数据 vec.erase(beg,end) 删除[beg,end]区间的数据 vec.front() 传回第一个数据。 vec.insert(pos,elem) 在pos位置插入一个elem拷贝,而非替代。 vec.pop_back() 删除最后一个数据。 vec.push_back(elem) 在尾部插入一个元素,而非替代。 vec.resize(num) 重新设置该容器的大小 vec.size() 回容器中实际数据的个数。 vec.begin() 返回指向容器第一个元素的迭代器 vec.end() 返回指向容器最后一个元素的迭代器
// 对于容器,使用迭代器操作容器中对应位置的值,当迭代器指向了容器中的某位置,则可以使用 * 加迭代器操作该位置了 std::vector myVec; for(int j =0 ; j<10 ; j++) { myVec.push_back(j); } std::vector::iterator p; // 定义一个迭代器 p = myVec.begin(); // 指向容器的首个元素 p ++; // 移动到下一个元素 *p = 20 ; // 修改该元素赋值,容器中的第二个值被修改为了20
vector< int > ivec( 10, 0 ); //定义了 ivec 它包含十个int型的元素 每个元素都被初始化为0。
int ia[ 6 ] = { 1, 2, 4, 8, 16, 32 };//对于内置数组 我们可以显式地把数组的元素初始化为一组常量值。
对于vector不能显式初始化,但是可以利用已存在的显式数组进行vector初始化赋值。
vector< int > ivec( ia, ia+5 );//定义int类型的vector,含有5个元素,将数组ia内5个元素拷贝到vector进行初始化。
vector不能像数组一样直接用下标来进行赋值,只能通过iterator指向了那个下标的元素,然后改变其元素值。