vector基本使用


vector是表示可变大小数组的序列容器,其大小可以可以动态改变,与数组一样采用连续的存储空间来存储元素。

template < class T, class Alloc = allocator<T> > class vector; // generic template

下面介绍vector的基本使用接口。

构造

在这里插入图片描述

1.无参构造

vector();

2.构造并初始化称n个value

vector(size_type n, const value_type& value = value_type());
//Member type size_type is an unsigned integral type.
//Member type value_type is the type of the elements in the container, defined in vector as an alias of the first template parameter (T).

3.拷贝构造

vector(const vector& x);

4.使用迭代器进行初始化构造

vector(inputIterator first,inputIterator last);
//InputIterator shall be an input iterator type that points to elements of a type from which value_type objects can be constructed.
//Notice that the range includes all the elements between first and last, including the element pointed by first but not the one pointed by last.

迭代器

1.正向迭代器

      iterator begin();
const_iterator begin() const;

      iterator end();
const_iterator end() const;

2.反向迭代器

      reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

      reverse_iterator rend();
const_reverse_iterator rend() const;

容量

1.获取数据个数

size_type size() const;

2,获取容量大小

size_type capacity() const;

3.判断是否为空

bool empty() const;

4.修改数据个数

void resize (size_type n, value_type val = value_type());

5.修改容量大小

void reserve (size_type n);

访问

1.返回第一个元素的引用

      reference front();
const_reference front() const;

2.返回最后一个元素的引用

      reference back();
const_reference back() const;

3.方括号下标访问

      reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

4.at下标访问

      reference at (size_type n);
const_reference at (size_type n) const;

at下标访问时会检查索引是否在正常范围内,如果索引超出范围,则抛出异常,这让使用更加安全,但也增加了函数调用时间,使用方括号下标访问则不进行安全检查,这时其性能比at下标访问高,但一旦索引越界,会导致未定义的行为,包括程序崩溃。

增删查改

1.尾插一个元素

void push_back (const value_type& val);

2.在position(注意这是迭代器)位置插入一个或多个元素

//在position位置插入一个元素
iterator insert (iterator position, const value_type& val);

//在position位置插入n个相同元素
void insert (iterator position, size_type n, const value_type& val);
    
//	利用迭代器在position位置插入元素
template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);
//Notice that the range includes all the elements between first and last, including the element pointed by first but not the one pointed by last.

3.尾删一个元素

void pop_back();

4.在position位置删除元素

iterator erase (iterator position);

//删除迭代器指向区间内的元素
iterator erase (iterator first, iterator last);

5.交换两个vector的数据空间

void swap (vector& x);

6.利用下标进行访问

      reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

7.此外补充一个非vector类成员函数,用于查找元素

template <class InputIterator, class T>
   InputIterator find (InputIterator first, InputIterator last, const T& val);

vector的具体使用可以查看具体文档:vector

注意事项

下面补充一下vector使用时的一些细节问题:
1.与string类迭代器一样,vector的迭代器也是左闭右开的,即begin()返回的迭代器指向头一个数据,可以访问,end()返回的迭代器指向末尾数据的下一个位置,不能访问。

2.不能使用vector< char>代替string类,string类存字符时末尾存有’\0‘,vector< char>末尾不存’\0’。

3.vs使用PJ版本的STL,capacity是按1.5倍增长,g++使用SGI版本的STL,capacity是按2倍增长。

4.不能直接使用cin和cout向vector对象中输入输出

5.迭代器失效
①在插入数据后,可能会发生扩容,一旦发生扩容,数据就会被转移到别的的放了,此时还指向旧地址的迭代器就会失效,所以insert函数返回一个迭代器以解决这个问题。
②有些编译器在删除元素后,可能会发生缩容,如果迭代器指向的空间刚好在缩容中被释放了,也会导致迭代器失效,所以erase函数也返回一个迭代器解决这个问题。
③在vs中,会认为只要迭代器被使用在删除函数中,那么该迭代器就不能使用了,即失效了,如erase(it),那迭代器it就失效了。
总的来说就是,在删除或插入数据后,前面的迭代器就不要使用了。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值