vector基本使用

vector

  • 构造
  • 迭代器
  • 容量
  • 增删查改
  • 注意事项

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

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

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

构造

vector基本使用_第1张图片

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.尾插一个元素

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使用时的一些细节问题:
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就失效了。
总的来说就是,在删除或插入数据后,前面的迭代器就不要使用了。

你可能感兴趣的:(c++)