C++之vector


 

一、标准库函数

1. 构造数组  ——参考博客

  一维数组构造:

// 构造一维数组
vector<int> vec(n);        // n为vec长度,默认所有值为0
vector<int> vec(n, 1);     // 所有值设为1

  二维m*n数组构造:

// 构造二维维数组
vector<int> tmp(n);        // n为vec长度,默认所有值为0
vector<vector<int> > vec(m, tmp);    // 所有值仍为0

 2. 空间相关

size_type size();       // 得到实际元素个数
size_type max_size();    // 系统可提供的vector容器能存放的元素数目的极限值
size_type capacity() const noexcept;    // 得到已申请的空间能存放的元素个数

* size_type即 unsigned int。vector max_size中未使用的部分不一定会保留,有可能使用时就出错了

 

void resize (size_type n); 
void resize (size_type n, const value_type& val); 
void reserve (size_type n);

  resize函数时扩展用户可见的空间大小。reserve将capacity扩展为n(相当于扩容时的操作)(当 n <= capacity时无操作)。

1)若 n <= size,保留前n个元素,后面的调用erase;否则,扩容到总大小为n。若 n > max_size,则还要申请更多空间(2倍于现空间,并将现有元素拷贝到新空间内)。

2)若提供了val,则新插入的值为val,否则插入默认值(0)。

 

3. assign 与 swap 

void assign (InputIterator first, InputIterator last);    // InputIterator: iterator of input vector
void assign (size_type n, const value_type& val);       // n elements with a copy of val
void assign (initializer_list<value_type> il);
vec.assign(input_vec.begin(), intpu_vec.end());
vec.assign(my_array, my_array+4);                 // my_array 是一个普通的数组 

   assign为vector分配新的内容,并将size设为新分配后的大小。

 

void swap (vector& x);
vec.swap(old_vec);

   swap交换两个vector的内容,相当于vec现在指向old_vec的空间,二者的所有属性都互换了。

 

4. erase 与 clear 

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last); 
void clear() noexcept;

 * erase 返回得到 指向被删除的位置的下一个位置的迭代器

 

  erase操作具体为:将尾部未删除的部分拷贝到删除的起始点处,将新尾部之后的内容 _Destory,再将尾部设为新尾部。  ——参考博客

  注意,_Destroy() 将对应的删除区的元素调用析构函数

1)若要销毁的为 int 等简单类型,析构不会对内存上的值操作;

2)如果元素是一些object,则它将为当前存储的每个元素调用它们各自的析构函数。 

3)如果元素是指向对象的指针,并不会自动调用对应的析构函数。直接clear会造成内存泄漏应遍历vector使用delete,然后再调用clear,完成删除。 

 

  clear调用 erase(begin(), end()) ,没有其它步骤。 

 

 

 二、部分细节

1. 使用下标访问元素时,不会进行越界检查,编译无问题; 可以使用 at() 函数读取元素,该函数内部会进行越界检查

 

2. 截取部分片段

#include <iostream>
#include <vector>
int main() {
    std::vector<int> vector{1,2,3,4,5,6,7,8,9};

    //截取前4个数
    std::vector<int>::const_iterator first1 = vector.begin();
    std::vector<int>::const_iterator last1  = vector.begin() + 4;  // 停止的地方,取到这一位之前一个
    std::vector<int> cut1(first1, last1);//截取后4个数
    std::vector<int>::const_iterator first2 = vector.end() - 4;
    std::vector<int>::const_iterator last2  = vector.end();
    std::vector<int> cut2_(first2, last2);            // 停止的地方
}

 

3. 支持的运算符

如果vector中的元素类型是简单类型(内置类型),则支持: !=, ==, <, <=, >, >=,后四种运算符可以用于比较两个vector的大小(按字典序)。

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281402.html

(0)
上一篇 2022年8月21日
下一篇 2022年8月21日

相关推荐

发表回复

登录后才能评论