和C++STL中vector的初次见面,vector常见用法即操作(零基础/小白)
目录
? ? ? ? 因为是对STL中vector容器的讲解,所以下面的讲述都是默认大家对STL的基本概念有所了解,即知道什么是容器,算法,迭代器即可,如果你还是不是很了解,可以花费几分钟快速浏览一下,下面这篇文章:
、C++中STL的概念——零基础/小白向,适合竞赛,初学C++者使用-CSDN博客
1. 基本概念:
? ? 功能:
? ? ? ? vector数据结构与数组非常相似,也称为单端数组。
? ? vector与普通数组的区别:
? ? ? ? 不同之处在于数组是静态空间,而vector是可以动态扩展的。
? ? 动态扩展:
? ? ? ? 动态扩展并不是在原空间之后开辟新空间,而是找到更大的内存空间,将原数据拷贝过来,释放原空间。
? ? 数据结构:顺序表
? ? ? ? 这里我们就介绍一个数据结构,叫做顺序表,它是线性表的一种,如果你有时间,你可以阅读下面这篇文章,详细了解什么是顺序表,并能用C语言写出顺序表底层代码,看完之后,你对STL的vector可能会有更深一层理解。
数据结构入门 --------- 顺序表的实现及应用(C语言/零基础/小白/新手 + 通讯录的实现)-CSDN博客
? ? ? ? 学习vector时,你一定要学会查看文档:https://cplusplus.com/reference/vector/vector/,当然你只需要熟练掌握接口就可,如果日后有就业需求,那你可以阅读相关底层代码。下面列出哪些接口是要重点掌握的。
? ? ? ? 这里我们先介绍几个vector容器的迭代器,迭代器你可以先简单的理解为指针,最常用的就是begin()和end(),如果是出现,先熟练掌握这两个,begin()获取的数组首元素的位置,end()获取数组尾元素的下一个位置,rbegin()获取最后一个元素的位置,rend()获得第一个元素的前一个位置。
? ? ? ? 在学习接口之前,你要明白你不需要可以去记住这些接口,你只需要掌握其中的一种你认为最好即可,我也会为你标红一些较为重要的接口。
2. 构造函数(初始化):
? ? ? ? 之后的接口都是先展示函数声明原型,在展示如何转换为代码,如果你对声明不理解,可以对照代码的使用。
????构造函数声明? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????接口说明
? ? ? ? vector()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 默认构造,无参构造
?????vector(n , val)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?构造函数将n个val拷贝给本身
vector<const vector& vec>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? 拷贝构造函数
vector<v.begin() , b.end()>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 使用迭代器进行初始化构造
//默认构造,无参构造
vector<int> v1;
//拷贝构造
vector<int> v2(v1);
//使用n个val拷贝构造
vector<int> v3(3,0); //放入3个0
//使用迭代器构造
vector<int> v4(v1.begin(),v1.end());
? ? ? ? 这里为了更好的给大家理解学习,我们就先写个代码,打印0 ~ 9的数字,将-数据放在vector容器,然后打印,因为是从零基础开始,所以不需要你会敲出,你只需要能看懂即可,我会做出详细说明。? ? ? ??????
vector<int> v1; //默认构造,无参构造
for (int i = 0;i < 10;i++)
{
v1.push_back(i); //插入,将数据放入容器
}
//定义一个迭代器从首元素位置开始,知道尾元素的下一个位置。
for (vector<int>::iterator i = v1.begin();i != v1.end();i++)
{
cout << *i << ' ';
}
cout << endl;
vector<int> v2(v1); //拷贝构造,将v1的数数据拷贝的v2中
//定义v2的迭代器,打印v2中数据
for (vector<int>::iterator i = v2.begin();i != v2.end();i++)
{
cout << *i << ' ';
}
cout << endl;
? ? ? ?两个重要构造接口,大家可能熟悉了,v1.push_back()接口可能不太熟悉,这里push_back()也是个接口,作用是将数据尾插(尾部插入)到容器中。
????????如何定义一个vector迭代器,vector<T>::iterator ~,T代表数据类型,~代表取的名,这里你简单的理解为迭代器是个指针。
3. 赋值操作:
? ? 赋值函数声明? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?????????接口说明
vector& opeartor =(constant vector& vec)? ? ? ? ? ? ? ? ? ? ? ? ? ? 重载等号操作符
assign(beg,end)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ? ? 将[beg , end)区间中数据拷贝给本身
assign(n,val)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 将n个val拷贝赋值给本身
vector<int> v1;
//1. 重载 =
vector<int> v2;
v2 = v1;
//2. assign,利用迭代器拷贝赋值
vector<int> v3;
v3.assign(v2.begin(),v2.end());
//3. 将n个val拷贝赋值给容器
vector<int> v4;
v4.assign(10, 0);
? ? ? ? 这里我们还是以打印0~9的数为例,再来写一段代码,你只需要先看懂
vector<int> v1;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
}
for (vector<int>::iterator i = v1.begin();i != v1.end();i++)
{
cout << *i << ' ';
}
cout << endl;
vector<int> v2;
v2 = v1;
for (vector<int>::iterator i = v2.begin();i != v2.end();i++)
{
cout << *i << ' ';
}
cout << endl;
vector<int> v3;
v3.assign(v2.begin(),v2.end());
for (vector<int>::iterator i = v3.begin();i != v3.end();i++)
{
cout << *i << ' ';
}
cout << endl;
vector<int> v4;
v4.assign(10, 0);
for (vector<int>::iterator i = v4.begin();i != v4.end();i++)
{
cout << *i << ' ';
}
cout << endl;
????????????????
4. 容量和大小:
函数原型:
empty();? ? ? ? ? ? ? ? ????????判断容器是否为空
capacity();? ? ? ? ? ? ? ? ? ? ?容器的容量
size();? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回容器中元素的个数
resize()? ? ? ? ? ? ? ? ? ? ? ? ? 重新指定容器的长度为num,若容器变长,用默认值(0)代替
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 若容器变短,超出元素个数的值被删除。
? ? ? ? 我们还是以打印0~9为例,对上述所有接口做一个概述:
vector<int> v;
for (int i = 0;i < 10;i++)
{
v.push_back(i);
}
for (vector<int>::iterator i = v.begin();i != v.end();i++)
{
cout << *i << ' ';
}
cout << endl;
if (v.empty())
{
cout << "vector为空" << endl;
}
else
{
cout << "vector不为空" << endl;
}
cout <<"capacity = " << v.capacity() << endl;
cout << "size = " << v.size() << endl;
v.resize(5);
cout << "resize = " << v.size() << endl;
????????????????
? ? ? ? 这里我们先创建一个vecot,插入0~9的数,再判断vector容器是否为空,打印结果,在打印vector此时空间大小和元素个数,再将元素个数调整为5,在打印元素个数。
? ? ? ? 需要注意的是resize()只是减少容器中的元素个数,容器开辟的内存空间大小还是没有变的,即只改变了size,没有改变capacity的值。
5. 插入和删除:
push_back(val);? ? ? ? ????????//尾部插入元素val
pop_back();? ? ? ? ? ? ? ? ? ? ? //尾部删除最后一个元素
insert(const_iterator pos , val);? ? ? ? ? ? ? ? //迭代器指向位置pos插入元素val
insert(const_iterator pos, count , val);? ? ? ? ? ? ? ? //迭代器指向位置pos插入count个元素val
erase(const_iterator pos);? ? ? ? ? ? ? ? ? ? ?//删除迭代器指向的元素
erase(const_iterator beg?, const_iterator end);? ? ? ? //删除区间[beg , end)之间元素
clear();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清空容器中所有元素
尾插和尾删:
? ? ? ? 这里我们先尾插两个数据,再尾删一个数据,分别打印两次容器里面的内容。
vector<int> v;
v.push_back(1);
v.push_back(2);
for (vector<int>::iterator it = v.begin();it != v.end();it++)
{
cout << *it<<' ';
}
cout << endl;
v.pop_back();
for (vector<int>::iterator it = v.begin();it != v.end();it++)
{
cout << *it;
}
插入和删除:
? ? ? ? 先插入插入两个数据,再在头部删除一个数据,分别打印两次结果。
vector<int> v;
v.push_back(1);
v.insert(v.end(), 2);
for (vector<int>::iterator it = v.begin();it != v.end();it++)
{
cout << *it<<' ';
}
cout << endl;
v.erase(v.begin());
for (vector<int>::iterator it = v.begin();it != v.end();it++)
{
cout << *it;
}
cout << endl;
?
当执行v.erase(v.begin() , v.end())的效果和clear()功能一样,都是清除vector容器中所有元素。
6. 数据存取:
函数原型:
at(int idx);? ? ? ? ? ? ? ? ? ? ? ? // 返回索引idx所指向的数据
operatorp[ ];? ? ? ? ? ? ? ? ? ? // 返回suoyinidx所指向的数据
front();? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 返回容器中第一个数据元素
back();? ? ? ? ? ? ? ? ? ? ? ? ? ? // 返回容器中最后一个数据元素
? ? ? ? 这里我们同样使用打印0~9,分别用[ ] 和 at?修改第一个数据,打印结果,在打印头部和尾部元素。
vector<int> v;
for (int i = 0;i < 10;i++)
{
v.push_back(i);
}
for (vector<int>::iterator it = v.begin();it != v.end();it++)
{
cout << *it << ' ';
}
cout << endl;
v[0] = -1;
for (vector<int>::iterator it = v.begin();it != v.end();it++)
{
cout << *it << ' ';
}
cout << endl;
v.at(0) = 0;
for (vector<int>::iterator it = v.begin();it != v.end();it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "front = " << v.front() << endl;
cout << "back = " << v.back() << endl;
7. 互换容器:
功能:实现两个容器内元素进行互换
函数原型:
? ? ? ? swap(vec);? ? ? ? //将本身与vec的元素内容进行互换。
vector<int> v1;
vector<int> v2;
v1.swap(v2);
? ? ? ? 这里将0-9的数据放在v1里面,9-0的数据放在v2里面,打印交换前 和 交换后的内容
vector<int> v1;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
}
cout << "v1 = ";
for (vector<int>::iterator it = v1.begin();it != v1.end();it++)
{
cout << *it << ' ';
}
cout << endl;
vector<int> v2;
for (int i = 9;i >= 0;i--)
{
v2.push_back(i);
}
cout << "v2 = ";
for (vector<int>::iterator it = v2.begin();it != v2.end();it++)
{
cout << *it << ' ';
}
cout << endl;
v1.swap(v2);
cout << "v1 = ";
for (vector<int>::iterator it = v1.begin();it != v1.end();it++)
{
cout << *it << ' ';
}
cout << endl;
cout << "v2 = ";
for (vector<int>::iterator it = v2.begin();it != v2.end();it++)
{
cout << *it << ' ';
}
cout << endl;
????????????????????????
? ? ? ? 这里还有一个扩展,swap还可以用于在减少元素个数时( resize() ),缩减内存空间。
vector<int> v1;
for (int i = 0;i < 10;i++)
{
v1.push_back(i);
}
cout << "v1.capacity = " << v1.capacity() << endl;
cout << "v1.size = " << v1.size() << endl;
v1.resize(5);
cout << "v1.capacity = " << v1.capacity() << endl;
cout << "v1.size = " << v1.size() << endl;
vector<int>(v1).swap(v1); //缩减内存空间
cout << "v1.capacity = " << v1.capacity() << endl;
cout << "v1.size = " << v1.size() << endl;
? ? ? ? 这里我们是创建了个匿名的vector对象,用v1里面的元素个数初始化匿名对象,这时匿名对象的size和capacity都为v1的size,v1再和匿名对象进行交换,这就能达到内存缩减的操作。
? ? ? ? C++STL内容众多,这里也只是对vector进行了初步的讲解,更为复杂的内容,日后会在专栏中更新,你可以订阅专栏,查看里面的最新的内容。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!