????????众所周知,不喜欢絮叨概念,直接上实操
? ? ? ? vector 不定长数组
????????首先,使用需要引入头文件?<vector>
#include <vector>
????????使用 vector 模板类来创建一个 vector 对象。可以创建存储特定类型元素的 vector,格式为: vector<数据类型> 名字。
vector<int> v;
????????当我们新建一个vector数组时,此时数组中没有任何元素,直接进行访问会报错,这个时候可以先进行一下初始化。
????????使用num个0来初始化。
vector<int>v;
v.resize(3);
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
return 0;
//输出内容是:0 0 0
或者将创建和初始化放在一起来做,下面同理。
vector < int > v(3);
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
return 0;
//输出内容是:0 0 0
????????使用n个num来初始化。
vector<int>v;
v.resize(3,3500);
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
return 0;
//输出内容是:3500 3500 3500
????????这种方法将创建、初始化和赋值同时进行,此时v.size()=5
vector < int > v = { 1,1,2,2,1 };
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
return 0;
//输出内容是:1 1 2 2 1
????????貌似C++98并不支持这种方法【Dev/C++98试了一下报错,但是没深究】本次使用的环境为vs2022/C++14
? ? ? ? 如果这个时候再加上v.resize(3);
vector < int > v = { 1,1,2,2,1 };
v.resize(3);
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
return 0;
//输出内容是:1 1 2
? ? ? ? v.resize(7);
vector < int > v = { 1,1,2,2 };
v.resize(6);
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
return 0;
//输出内容是:1 1 2 2 0 0
????????注意!,两个数组都需要是vector数组。
vector < int > test = { 1,2,3 };
vector < int > v(test);
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
return 0;
//输出内容是:1 2 3
或者可以将vector < int > v(test);替换成vector < int > v=test;效果是一样的。
????????vector < int > v (*p, *q); 使用另外一个数组的指针来初始化v,这里既可以使用vector的指针,也可以使用普通数组的指针。
int arr[5] = { 1,2,3,4,5 };
vector<int> v = { 1,2,3,4 };
//输出内容是:1 2 3
vector<int> vector1(arr, arr + 3);
for (int i = 0; i < vector1.size(); i++)
cout << vector1[i] << " ";
cout << endl;
//输出内容是:2 3
vector<int> vector2(v.begin() + 1, v.end() - 1);
for (int i = 0; i < vector2.size(); i++)
cout << vector2[i] << " ";
cout << endl;
v.back() | 返回 v 中最后一个元素的引用 |
v.front() | 返回 v 中第一个元素的引用 |
cout << v[0]<< " ";
//使用at()
arr.at(3); //vector中第三位的数值
v.size();
v.push_back(100);
????????使用insert()函数来在指定位置插入元素。需要提供插入位置和要插入的元素值。
? ? ? ? ?网上都说要用迭代器,我其实不太懂为什么一定要用迭代器呢?貌似也无所谓可以不用
vector<int> v = { 100,200,300,400,500,600 };
v.insert(v.begin(), 1); //向索引为0的位置插入元素1
//输出内容为:1 100 200 300 400 500 600
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
v.insert(v.begin() + 2, 2); //向索引为2的位置插入元素2
//输出内容为:1 100 2 200 300 400 500 600
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
v.insert(v.end(), 9); //向v的末尾插入元素9
//输出内容为:1 100 2 200 300 400 500 600 9
for (int i = 0; i < v.size(); i++)
cout << v[i] << " ";
cout << endl;
return 0;
? ? ? ? 所以我没有用迭代器。
????????v.insert(m, n, val)?:在迭代器 m?之前插入 n 个值为 val 的元素,返回新添加的第一个元素的迭代器。
? ? ? ? 总结一下insert()的几种用法:
?????//第一种格式用法
??? v.insert(v.begin() + 1, 3);//{1,3,2}
??? //第二种格式用法
??? v.insert(v.end(), 2, 5);//{1,3,2,5,5}
??? //第三种格式用法
??? array<int,3>test{ 7,8,9 };
??? v.insert(v.end(), test.begin(), test.end());//{1,3,2,5,5,7,8,9}
??? //第四种格式用法
??? v.insert(v.end(), { 10,11 });//{1,3,2,5,5,7,8,9,10,11}
v1.swap(v2);//互换两个vector
arr.empty()//判断是否为空
????????使用pop_back()函数删除 vector 末尾的元素,默认且只能删除末尾的元素?
v.pop_back();
????????使用erase()?函数来删除指定位置的元素。
v.erase(p)?:删除迭代器 p 所指的元素,返回指向被删除元素之后元素的迭代器。
v.erase(b, e)?:删除迭代器 b, e 之间的元素,返回指向最后一个被删除元素之后元素的迭代器。
v.erase(v.begin()+2)//第三个
v.erase(v.begin()+1);//删除指定位置元素
v.erase(v.begin()+i,v.end()+j)?; 删除区间[ i,j-1] 区间从0开始
????????使用remove()函数来删除指定值的元素。
if(在目标vector中找到该数值的元素)
? ? ? ? 直接删除
else
????????不做任何操作,不会报错
? ?v .erase(remove(v.begin(), v.end(), 500), v.end()); //删除数值为500的元素
? ? ? ? 直接修改
v[0]=1;
使用find()函数来查找指定值的元素
vector<int> v = { 1,2,3,4,5,6 };
vector<int>::iterator it = find(v.begin(), v.end(), 5);
//输出内容为:目标元素的索引为: 4
if (it != v.end()) {
cout << "目标元素的索引为: " << distance(v.begin(), it) << endl;
}
else {
cout << "没有找到" << endl;
使用clear()
?函数可以清空 vector 中的所有元素。
v.clear();
vector<int>::iterator it
vector<int>::iterator it=v.begin();
先空着以后补
sort(v.begin(), v.end());
????????使用到的函数为?unique()?:将输入序列相邻的重复项“消除”,返回一个指向不重复值范围末尾的迭代器。
? ? ? ? 如果配合sort()和erase()使用,可以达到去重的效果。先排序,再去重
vector<int> v = { 1,20,3,4,50,6 };
sort(v.begin(), v.end()); // 先排序
v.erase(unique(v.begin(), v.end()), v.end());
????????需要头文件#include<algorithm>
vector<int> v = { 1,20,3,4,50,6 };
reverse(v.begin(), v.end());
for (int i : v)
cout << i << " ";
最大值:int maxValue = *max_element(vec.begin(),vec.end());
最小值:int minValue = *min_element(vec.begin(),vec.end());
// 最大值下标
int maxPosition = max_element(v.begin(),v.end()) - v.begin();
// 最小值下标
int maxPosition = max_element(v.begin(),v.end()) - v.begin();
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
vector<int> vec;
int v[] = {10,22,11,23,12,11,16,17,19,30};
for( int ii=0;ii<10;ii++ )
{
vec.push_back(v[ii]);
}
int maxValue = *max_element(vec.begin(),vec.end());
int minValue = *min_element(vec.begin(),vec.end());
// 最大值下标
int maxPosition = max_element(v.begin(),v.end()) - v.begin();
// 最小值下标
int maxPosition = max_element(v.begin(),v.end()) - v.begin();
printf("maxValue = %d.\n",maxValue);
printf("minValue = %d.\n",minValue);
return 0;
}
vector < vector < int > > v;
????????和一维数组几乎一样,在这里仅用两样举一下例子。
vector < vector < int > > v;
v.resize(5);
for (int i = 0; i < 5; i++)
v[i].resize(5);
for (int i = 0; i < v.size(); i++)
{
for (int j = 0; j < v[i].size(); j++)
{
cout << v[i][j] << " ";
}
cout << endl;
}
return 0;
//输出内容是:
//0 0 0 0 0
//0 0 0 0 0
//0 0 0 0 0
//0 0 0 0 0
//0 0 0 0 0
vector <int> t(4, 0);
vector < vector < int > > v(4, t);
for (int i = 0; i < v.size(); i++)
{
for (int j = 0; j < v[i].size(); j++)
{
cout << v[i][j] << " ";
}
cout << endl;
}
? ? ? ? 先空着,这个不会