目录
一、vector类的组织形式
二、vector类的成员函数
1.默认成员函数
(1)构造函数、拷贝构造函数
(2)析构函数和赋值运算符重载
2.容量操作
3.迭代器(iterator)
4.元素访问
5.修改操作
一、vector类的组织形式
vector是可变大小的序列容器,底层组织为顺序表,大小可变,数据类型自由,也可以采用下标对vector的元素进行访问。
这是cplusplus网站上vector的介绍:
下面我将介绍vector的常用接口
二、vector类的成员函数
1.默认成员函数
在成员函数的第一部分就是string的三个默认成员函数,从上到下为构造函数、拷贝构造函数、析构函数和赋值运算符重载
(1)构造函数、拷贝构造函数
vector的构造与拷贝构造函数常用的有以下四个:
vector();——————不传参的默认构造,构造空vector对象,相当于空的顺序表
vector(size_type n, const value_type& val = value_type());——————构造一个vector并插入n个value_type类型的默认构造变量。
vector (const vector& x);——————拷贝构造一个vector变量
vector (InputIterator first, InputIterator last);——————用另一个自定义类型变量(这里的变量的类型不一定是vector)的迭代器的两个位置为头尾,初始化这个vector变量
测试代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1;
for (auto e : v1)
{
cout << e;
}
cout << endl;
vector<int> v2(10, 1);
for (auto e : v2)
{
cout << e;
}
cout << endl;
vector<int> v3(v2);
for (auto e : v3)
{
cout << e;
}
cout << endl;
vector<int> v4(v2.begin(), v2.end());
for (auto e : v4)
{
cout << e;
}
cout << endl;
string s = "hello world";
vector<char> v5(s.begin(), s.end());
for (auto e : v5)
{
cout << e;
}
cout << endl;
return 0;
}
测试结果:
(2)析构函数和赋值运算符重载
析构函数不可重载的特性只有一个:~vector(),一样直接释放空间,指针置空即可。
vector& operator= (const vector& x);——————将x的内容赋值给左侧变量,没什么好讲的。
2.容量操作
容量操作包含以下内容:
size_t size() const;——————返回vector有效数据的数目
size_t max_size() const;——————返回vector可储存数据的数量上限,此接口在使用中没有意义
void resize (size_t n, value_type val = value_type());——————改变空间大小,若新空间大于旧空间插入对应字符,小于则直接截断
size_t capacity() const;——————返回已开辟空间足够储存多少个元素
bool empty() const;——————检测当前vector是否为空
void reserve (size_t n);——————如果n值大于当前的空间大小,便扩大空间到n个字符,小于则不做改变。
void shrink_to_fit();——————将vector的容量缩小到有效数据的大小
测试代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 1);
cout << v1.size() << endl;
cout << v1.capacity() << endl;
for (auto e : v1)
{
cout << e;
}
cout << endl;
v1.resize(10, 3);
for (auto e : v1)
{
cout << e;
}
cout << endl;
cout << v1.empty() << endl;
v1.reserve(20);
cout << v1.size() << endl;
cout << v1.capacity() << endl;
return 0;
}
测试结果:
3.迭代器(iterator)
vector同样有两个迭代器:正向和反向迭代器
vector的正向迭代器
iterator begin();——————vector的头,可读可写
const_iterator begin() const;——————vector的头,只读
iterator end();——————vector的尾,可读可写
const_iterator end() const;——————vector的尾,只读
vector的反向迭代器
reverse_iterator rbegin();——————vector的逆向的头,可读可写
const_reverse_iterator rbegin() const;——————vector的逆向的头,只读
reverse_iterator rend();——————vector的逆向后的尾,可读可写
const_reverse_iterator rend() const;——————vector的逆向的尾,只读
测试代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
vector<int>::iterator it1 = v1.begin();
while (it1 != v1.end())
{
printf("%d", *it1);
it1++;
}
cout << endl;
vector<int>::reverse_iterator it2 = v1.rbegin();
while (it2 != v1.rend())
{
printf("%d", *it2);
it2++;
}
cout << endl;
vector<int>::iterator it3 = v1.begin();
while (it3 != v1.end())
{
*it3 = 1;
it3++;
}
it3 = v1.begin();
while (it3 != v1.end())
{
cout << *it3;
it3++;
}
cout << endl;
return 0;
}
测试结果:
4.元素访问
operator[]——————直接重载[]使s[i]就可以直接访问对应下标元素,而且也加上了越界的检查,提高了程序的安全性。
reference operator[] (size_t n);——————可读可写
const_reference operator[] (size_t n) const;——————只读
at函数——————与[]作用相同
reference at (size_t n);——————可读可写
const_reference at (size_t n) const;——————只读
测试代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
vector<int>::iterator it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
cout << v1[1] << endl;
cout << v1.at(1) << endl;
v1[1] = 6;
it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
return 0;
}
测试结果:
5.修改操作
assign——————将原本的内容删除然后放入相应数据
template
void assign (InputIterator first, InputIterator last);——————将对象通过另一个对象的迭代器赋值
void assign (size_t n, const value_type& val);——————赋值对象为含有n个val对象的vector
void push_back(char c);——————尾插变量
void push_back(char c);——————尾插变量
insert——————在特定位置插入内容
iterator insert (iterator position, const value_type& val);——————在position的迭代器位置插入val变量
void insert (iterator position, size_t n, const value_t& val);——————在position的迭代器位置开始插入n个val变量
template
void insert (iterator position, InputIterator first, InputIterator last);——————在position的迭代器位置插入迭代器从first位置到last位置的内容
erase——————清除内容
iterator erase (iterator position);——————清除position的迭代器位置的内容
iterator erase (iterator first, iterator last);——————清除从first到last的迭代器位置的所有内容
void clear();——————清除string的内容为空字符串,但不释放空间
测试代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
//template <class InputIterator>
//void assign(InputIterator first, InputIterator last);
// void assign(size_t n, const value_type& val);
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
vector<int>::iterator it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
vector<int> v2;
v2.assign(v1.begin() + 1, v1.end() - 1);
for (auto e : v2)
{
cout << e;
}
cout << endl;
vector<int> v3;
v3.assign(4, 1);
for (auto e : v3)
{
cout << e;
}
cout << endl;
//iterator insert(iterator position, const value_type& val);
//void insert(iterator position, size_t n, const value_t& val);
//template <class InputIterator>
// void insert(iterator position, InputIterator first, InputIterator last);
v1.insert(v1.begin(), 1);
it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
v1.insert(v1.end(), 4, 7);
it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
v1.insert(v1.begin(), v2.begin(),v2.end());
it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
//iterator erase(iterator position);
//iterator erase(iterator first, iterator last);
v1.erase(v1.begin());
it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
v1.erase(v1.begin(), v1.end());
it1 = v1.begin();
for (auto e : v1)
{
cout << e;
}
cout << endl;
return 0;
}
测试结果: