知识框架
1.构造函数
基础语法
默认构造:vector<T> v;
拷贝构造:vector(v.begin(), v.end());
拷贝构造:vector(n, elem);
拷贝构造:vector(const vector &vec);
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
void printvector(vector<int>& v){
for(vector<int>::iterator it = v.begin();it != v.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
void test01(){
vector<int> v1;
for(int i = 0;i<3;i++){
v1.push_back(i);
}
vector<int> v2(v1.begin(),v1.end());
vector<int> v3(3,10);
vector<int> v4(v3);
printvector(v1);
printvector(v2);
printvector(v3);
printvector(v4);
}
int main(){
test01();
system("pause");
return 0;
}
2.赋值操作
基础语法
等号的重载:vector<int> v2 = v1;
assign的调用:
vector<int> v3; v3.assign(v1.begin(),v1.end());
assign的调用:
vector<int> v4; v4.assign(3,10);
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
void printvector(vector<int>& v){
for(vector<int>::iterator it = v.begin();it != v.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
void test01(){
vector<int> v1;
for(int i = 0;i<3;i++){
v1.push_back(i);
}
vector<int> v2 = v1;
vector<int> v3;
v3.assign(v1.begin(),v1.end());
vector<int> v4;
v4.assign(3,10);
printvector(v1);
printvector(v2);
printvector(v3);
printvector(v4);
}
int main(){
test01();
system("pause");
return 0;
}
3.容量&大小
基础语法
empty();
//判断容器是否为空
capacity();/
/容器的容量
size();
/返回容器中元素的个数
resize(int num);
//重新指定容器的长度为num
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
void printvector(vector<int>& v){
for(vector<int>::iterator it = v.begin();it != v.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
void panduan(vector<int>& v1){
if(v1.empty()){
cout<<"v1容器为空"<<endl;
}
else{
cout<<"v1容量为:"<<v1.capacity()<<endl;
cout<<"v1大小为:"<<v1.size()<<endl;
}
}
void test01(){
vector<int> v1;
for(int i = 0;i<3;i++){
v1.push_back(i);
}
printvector(v1);
panduan(v1);
cout<<"--------------------------------------------------"<<endl;
v1.resize(5);
printvector(v1);
panduan(v1);
cout<<"--------------------------------------------------"<<endl;
v1.resize(10,10);
printvector(v1);
panduan(v1);
cout<<"--------------------------------------------------"<<endl;
}
int main(){
test01();
system("pause");
return 0;
}
4.插入&删除
基础语法
push_back(ele);
//尾部插入元素ele
pop_back();
//删除最后一个元素
insert(const_iterator pos, ele);
//迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count,ele);
//迭代器指向位置pos插入count个元素ele
erase(const_iterator pos);
//删除迭代器指向的元素
erase(const_iterator start, const_iterator end);
//删除迭代器从start到end之间的元素
clear();
//删除容器中所有元素
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
void printvector(vector<int>& v){
if(v.empty()){
cout<<"v1容器为空"<<endl;
}
else{
for(vector<int>::iterator it = v.begin();it != v.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
}
void test01(){
vector<int> v1;
for(int i = 0;i<3;i++){
v1.push_back(i);
}
printvector(v1);
cout<<"------------------------原始数组"<<endl;
v1.push_back(3);
printvector(v1);
cout<<"------------------------push_back后效果"<<endl;
v1.pop_back();
printvector(v1);
cout<<"------------------------pop_back后效果"<<endl;
v1.insert(v1.begin(),1);
printvector(v1);
cout<<"------------------------insert一个数后效果"<<endl;
v1.insert(v1.begin()+1,2,3);
printvector(v1);
cout<<"------------------------insert多个数后效果"<<endl;
v1.erase(v1.begin());
printvector(v1);
cout<<"------------------------erase删除单个元素后效果"<<endl;
v1.erase(v1.begin(),v1.begin()+2);
printvector(v1);
cout<<"------------------------erase删除多个元素后效果"<<endl;
v1.clear();
printvector(v1);
cout<<"------------------------clear清除所有元素后效果"<<endl;
}
int main(){
test01();
system("pause");
return 0;
}
5.数据存取
基础语法
at(int idx);
//返回索引idx所指的数据
operator[];
//返回索引idx所指的数据
front();
//返回容器中第一个数据元素
back();
//返回容器中最后一个数据元素
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
void test01(){
vector<int> v1;
for(int i = 0;i<3;i++){
v1.push_back(i);
}
v1.at(0) = 2;
for(int it =0;it < v1.size();it++){
cout<<v1.at(it)<<" ";
}
cout<<"--------------------------------at类型存取"<<endl;
v1[2] = 0;
for(int it =0;it < v1.size();it++){
cout<<v1[it]<<" ";
}
cout<<"--------------------------------[]类型存取"<<endl;
cout<<"v1首元素为:"<<v1.front()<<endl;
cout<<"v1尾元素为:"<<v1.back()<<endl;
}
int main(){
test01();
system("pause");
return 0;
}
6.容器互换
基础语法
swap(vec);
// 将vec与本身的元素互换
注:巧用容器互换可实现内存收缩(具体实现见代码test02())
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
void printvector(vector<int>& v){
if(v.empty()){
cout<<"v1容器为空"<<endl;
}
else{
for(vector<int>::iterator it = v.begin();it != v.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
}
//基础语法测试
void test01(){
vector<int> v1;
for(int i = 0;i<3;i++){
v1.push_back(i);
}
vector<int> v2;
for(int i = 3;i>0;i--){
v2.push_back(i);
}
cout<<"-------交换前-------"<<endl;
cout<<"v1中元素为:"<<" ";
printvector(v1);
cout<<"v2中元素为:"<<" ";
printvector(v2);
cout<<"-------交换后-------"<<endl;
v1.swap(v2);
cout<<"v1中元素为:"<<" ";
printvector(v1);
cout<<"v2中元素为:"<<" ";
printvector(v2);
}
//收缩内存测试
void test02(){
vector<int> v;
for(int i = 0;i<10000;i++){
v.push_back(i);
}
cout<<"-------原始容量大小-------"<<endl;
cout<<"v容量为:"<<v.capacity()<<endl;
cout<<"v大小为:"<<v.size()<<endl;
cout<<"-------重置后容量大小-------"<<endl;
v.resize(3); //此时会出现浪费大量内存的情况
cout<<"v容量为:"<<v.capacity()<<endl;
cout<<"v大小为:"<<v.size()<<endl;
cout<<"-------交换后容量大小-------"<<endl;
vector<int>(v).swap(v); //设定匿名对象和v做互换,收缩内存空间
cout<<"v容量为:"<<v.capacity()<<endl;
cout<<"v大小为:"<<v.size()<<endl;
//解释:vector<int>(v)是一个匿名对象,利用拷贝构造大小同v一致。
}
int main(){
//test01();
test02();
system("pause");
return 0;
}
运行结果
7.预留空间
基础语法
reserve(int len);
//容器预留len个元素长度,预留位置不初始化,元素不可访问。
注:通过预留空间,可大大减少内存开辟次数,具体实现见代码。
代码实现
#include<iostream>
using namespace std;
#include<string>
#include<vector>
//未预留空间情况测试
void test01(){
vector<int> v1;
int num = 0;
int* p = NULL;
//插入元素
for(int i =0;i<10000;i++){
v1.push_back(i);
//统计开辟空间次数
if(p!=&v1[0]){
p = &v1[0];
num++;
}
}
cout<<"未预留空间情况下空间开辟次数:"<<num<<endl;
}
//预留空间情况测试
void test02(){
vector<int> v2;
v2.reserve(10000);
int num1 = 0;
int* p = NULL;
//插入元素
for(int i =0;i<10000;i++){
v2.push_back(i);
//统计开辟空间次数
if(p!=&v2[0]){
p = &v2[0];
num1++;
}
}
cout<<"预留空间情况下空间开辟次数:"<<num1<<endl;
}
int main(){
test01();
test02();
system("pause");
return 0;
}
运行结果
本文是根据B站内容:《黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难》:https://www.bilibili.com/video/BV1et411b73Z?p=314 学习整理笔记。