C++ STL之vector容器

目录

一、vector容器的介绍

二、vector容器的使用

1.vector的构造函数

2.vector的赋值操作

3.vector的容量与大小

4.vector的插入和删除

5.vector的数据存取

6.vector的互换容器

7.算法模块在vector的应用

①find算法(std)

②sort算法(std)


一、vector容器的介绍

引用的头文件:#include

vector是C++ STL中的一个容器,它是一个动态数组,可以进行元素的插入和删除,在此过程中,vector会动态调整所占用的内存空间,整个过程无需手动干预。vector容器是一个封装了动态大小数组的顺序容器能够存放各种类型的对象(包括自定义类型)。vector容器中的元素按照严格的线性顺序排序。vector容器的空间是动态增长的。

能够存放各种类型的对象:

如:vector v1;

       vector> v2;

       vector s = {"a", "aa", "aaa"};

动态增长:当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

按照严格的线性顺序排序:允许使用容器时,进行随机访问。

通常,使用 vector 容器是最好的选择,除非你有很好的理由选择其他容器。

二、vector容器的使用

1.vector的构造函数

vector; // 使用模板类,默认构造函数
vector(size_t n, const T& val = T()); // 

vector{a, b, c, ...}; // 包含了初始值个数的元素

vector = {a, b, c, ...}; // 等价于vector{a, b, c, ...};

vector(v.begin(), v.end()); // 将[v.begin(),v.end())区间中的元素拷贝给本身

vector(size_t n, const T& val = T()); // 将n个val拷贝给本身,若val未指定则以默认值初始化

vector(const vector &v); // 拷贝构造函数

使用如下:

// ...
using namespace std;
// ...
void PrintVector(const vector& v)
{
	for (auto& e : v)
	{
		cout << e << " ";
	}
}
// ...
vector v1;
vector v2(4, 2);
vector v3(v2);
vector v4{1, 2, 3, 4, 5};
PrintVector(v3);
// ...

输出结果:

2
2
2
2

2.vector的赋值操作

vector& operator=(const vector& v); // 重载赋值运算符
void assign(v.begin(), v.end()); // 将[v.begin(),v.end())区间中的元素赋值给本身
void assign(size_t n, const T& val = T()); // 将n个val赋值给本身

使用如下:

void text02()
{
	vector v1,v2;
	for (int i = 0; i < 5; ++i)
	{
		v1.push_back(i);
	}
	v2 = v1;                         // 赋值运算符重载
	vector v3,v4;
	v3.assign(v1.begin(), v1.end()); // 区间赋值
	v4.assign(5, 9);
	cout << "打印v2: ";
	PrintVector(v2);
	cout << "打印v3: ";
	PrintVector(v3);
	cout << "打印v4: ";
	PrintVector(v4);
}

3.vector的容量与大小

bool empty();
 // 判断容器是否为空

size_t capacity();
 // 返回容器的容量

siez_t size();
 // 返回容器的大小,即容器中元素的个数

void reserve(size_type n);
 // 预分配vector的内存空间大小

void resize(size_type n, value_type val = value_type());
 // 改变vector的size为num,若容器变长,则以val填充新位置,如果容器变短,则末尾超过容器长度的元素被删除

注:

reserve函数若分配小于当前的容量大小则不进行任何操作。

注:capacity的代码在 vs 和 g++ 下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,顺序表增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。 

C++ STL之vector容器_第1张图片

4.vector的插入和删除

void push_back(const value_type& val);
 // 尾部插入元素val
void pop_back();
 // 删除最后一个元素
iterator insert(iterator pos, const value_type& val);
 // 在迭代器指向的位置pos处插入一个元素val,并返回指向新插入元素的迭代器
void insert(iterator pos, size_type n, const value_type& val);
 // 在迭代器指向的位置pos处插入n个元素val
iterator erase(const_iterator pos);
 // 删除迭代器指向的元素,并返回下一个元素的迭代器
iterator erase(const_iterator begin, const_iterator end);
 // 删除迭代器[begin, end)之间的所有元素,并返回下一个元素的迭代器,失败返回迭代器end
clear();
 // vector的size将变成0,但是它的容量capacity并未发生改变

【注意】

iterator insert (const_iterator position, const value_type& val);

函数会在指定位置插入一个元素,并返回插入后该元素在容器中的迭代器。

具体来说,如果插入元素成功,则返回一个指向插入的元素的迭代器。如果插入元素失败(例如,由于内存分配失败),则返回一个指向容器末尾的迭代器。

iterator erase (const_iterator first, const_iterator last);

函数返回一个迭代器,指向最后一个被删除元素的下一个元素。

具体来说,如果删除了[first, last)范围内的元素,则返回一个指向last的迭代器。如果[first, last)范围内的元素为空,则返回一个指向first的迭代器。

迭代器:

C++ STL之vector容器_第2张图片

迭代器失效问题:

会引起其底层空间容量改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。

注意更新迭代器变量

使用如下:

//...
vector v4{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
v4.push_back(10);
v4.push_back(11);

v4.pop_back();
v4.pop_back();

v4.insert(v4.begin() + 1, 3,345);
v4.erase(v4.begin() + 7, v4.end());

PrintVector(v4);
//...

输出结果:

1 345 345 345 2 3 4

5.vector的数据存取

at(int idx); // 返回索引idx所指的数据
operator[];  // 返回[]内索引所指的数据
front();     // 返回容器中第一个元素
back();      // 返回容器中最后一个元素

6.vector的互换容器

void swap(vector& v); // 容器v和当前容器互换

7.算法模块在vector的应用

①find算法(std)

template
InputIterator find(InputIterator first, InputIterator last, const T& val)
{
	while (first != last)
	{
		if (*first == val) return first;
		++first;
	}
	return last;
}

注:find未找到,则返回迭代器类型对象v.end()。

代码演示:

//...
vector v4{ 9, 8, 7, 10, 6, 5, 4, 11, 3, 2, 1 };
v4.insert(v4.begin() + 1, 2,345);
vector::iterator pos = find(v4.begin(), v4.end(), 4);
if (pos != v4.end())
{
	v4.erase(pos);
}
PrintVector(v4);
//...

输出结果:

9 345 345 8 7 10 6 5 11 3 2 1

②sort算法(std)

引用的头文件:#include

default (1):
template 
void sort (RandomAccessIterator first, RandomAccessIterator last);

custom (2):
template 
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

 代码演示:

//...
vector v4{ 9, 8, 7, 10, 6, 5, 4, 11, 3, 2, 1 };
v4.insert(v4.begin() + 1, 2,345);
vector::iterator pos = find(v4.begin(), v4.end(), 4);
if (pos != v4.end())
{
	v4.erase(pos);
}

sort(v4.begin(), v4.end());
PrintVector(v4);
//...

输出结果:

1 2 3 5 6 7 8 9 10 11 345 345

你可能感兴趣的:(C++从入门到入土,c++)