自学内容网 自学内容网

C++ vector的使用

###vector介绍:

vector是C++中引入的类模板,这个模板相当于顺序表,里面可以存放不同类型的数据,同时实现了多个接口去完成对vector对象的各种操作;

基本使用方式:

#include<vector>//包含头文件

using namespace std;//展开头文件中的命名空间

int main()

{

        vector<int> v;//定义一个vector对象,这个对象存放的是int类型的数据;

}

一、vector的构造、析构和赋值

1、构造

  • 不传参数构造,这个vector中没有数据;

  • 第一个参数为数据个数,第二个参数为数据值,完成构造;

  • 用已存在的vector去构造另一个vector;

  • 用已存在的vector的一部分去初始化;

  • 用数组去初始化(两个参数都是指向数组元素的指针,指针之间包含的数据就是要去初始华的数据)。 
void test01()
{
//不初始化,v1里面没有数据
vector<int> v1;
cout << "data:";
for (auto i : v1)
{
cout << i << ' ';
}
cout << endl;

//用10个1初始化
vector<int> v2(10, 1);
cout << "data:";
for (auto i : v2)
{
cout << i << ' ';
}
cout << endl;
//用vector去初始化vector
vector<int> v3(v2);
cout << "data:";
for (auto i : v3)
{
cout << i << ' ';
}
cout << endl;

//用vector对象的一部分去初始化(使用迭代器)
vector<int> v4(v3.begin() + 1, v3.end() - 1);
cout << "data:";
for (auto i : v4)
{
cout << i << ' ';
}
cout << endl;

//用数组初始化
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//可以理解为地址的范围中含有的数据
vector<int> v5(arr, arr+sizeof(arr) / sizeof(arr[0]));
cout << "data:";
for (auto i : v5)
{
cout << i << ' ';
}
cout << endl;
}

2、析构

清除所有的元素,并且把vector对象申请的空间释放

3、赋值

将一个vector对象的元素个数,数据值,容量大小赋值给另一个对象,但是两个vector对象的地址不变

二 、迭代器

 与string的迭代器类似

void test02()
{
vector<int> v1(10,9);
vector<int>::iterator it = v1.begin();
while (it != v1.end())
{
(*it)++;
cout << *it << " ";
it++;
}
cout << endl;
vector<int>::const_iterator cit = v1.cbegin();//cit指向的数据不能被改变
while (cit != v1.cend())
{
cout << *cit << " ";
cit++;
}
}

 三、容量:

vector<int> v1(10, 1);
//size
cout << v1.size() << endl;
//capacity
cout << v1.capacity() << endl;
//empty
cout << v1.empty() << endl;

不为空,empty返回假,0代表假;

reserve在VS里面默认只会扩大,当要reserve的值比vector对象的容量小时,不改变capacity

//reserve
vector<int> v2(10, 9);
v2.reserve(20);
cout << v2.size() << endl;
cout << v2.capacity() << endl;
v2.reserve(5);
cout << v2.size() << endl;
cout << v2.capacity() << endl;
v2.reserve(30);
cout << v2.size() << endl;
cout << v2.capacity() << endl;

 resize 改变对象size的值;缩小就相当于从尾部删除数据,增大就从尾部加数据,这些加的数据可以给特定的值:

//resize
vector<int> v3(10, 1);
cout << v3.size() << endl;
cout << v3.capacity() << endl;
for (auto i : v3)
{
cout << i << " ";
}
cout << endl;

v3.resize(5);
cout << v3.size() << endl;
cout << v3.capacity() << endl;
for (auto i : v3)
{
cout << i << " ";
}
cout << endl;

v3.resize(20,9);
cout << v3.size() << endl;
cout << v3.capacity() << endl;
for (auto i : v3)
{
cout << i << " ";
}
cout << endl;

当resize扩大size时,不给特定的值,就默认为0。

四、元素获取

void test04()
{
vector<int> v1(10, 1);
//通过下标访问数据//[]
for (size_t i = 0; i < v1.size(); i++)
{
cout << v1[i] << ' ';
}
cout << endl;

//at
for (size_t i = 0; i < v1.size(); i++)
{
cout <<v1.at(i)<< ' ';
}
cout << endl;

//front back分别获取第一个个最后一个的数据
vector<int> v2(10);
v2[0] = 100;
v2[v2.size()-1] = 999;
cout << v2.front() << endl;
cout << v2.back() << endl;

//data获取vector对象的地址
vector<int> v3(10, 9);
int* p = v3.data();//此时p是v3首个数据的地址
*p = 100;
p++;//第二个数据地址
*p = 200;
p[2] = 400;//p从第二个数据的地址往后加2,就是原数据的第四个数据的地址
for (size_t i = 0; i < v3.size(); i++)
{
cout << v3[i] << ' ';
}
}

 

五、修改

尾插和尾删

//push_back、pop_back
//尾插和尾删
vector<int> v1(10, 10);
v1.push_back(999);
v1.push_back(888);
v1.pop_back();
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;

insert插入数据,vector里面涉及的insert相比于string更加简洁;这里的position都是迭代器操作的

  1. 在position位置之前插入数据val;
  2. 在position位置之前插入n个val数据;
  3. 在一个vector对象的position位置之前插入另一个vector对象的一段迭代器区间中的数据;

 

//insert
vector<int> v1(10, 10);
v1.insert(v1.begin()+6, 999);
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;

v1.insert(v1.begin(), 3, 888);
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;

vector<int> v2(10, 6);
v1.insert(v1.begin(), v2.begin() + 5, v2.end());
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;

erase删除一个或者一段数据,通过迭代器实现

//erase
vector<int> v1(10);
for (size_t i = 0; i < v1.size(); i++)
{
v1[i] = i;
}
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
//删除一个数据
v1.erase(v1.begin());
for (auto i : v1)
{
cout << i << " ";
}
cout << endl;
//删除一段数据
v1.erase(v1.begin(), v1.end() - 5);
for (auto i : v1)
{
cout << i << " ";
}

 


原文地址:https://blog.csdn.net/zc331/article/details/142300864

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!