LOADING

加载过慢请开启缓存 浏览器默认开启

STL的Vector的使用

2024/7/13 STL STL

Vector的使用

头文件

​ 首先,使用需要引入头文件 <vector>

#include <vector>

初始化

v.resize(num)

​ 使用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

v.resize(n, num)

​ 使用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

vector<int>v={1,1,2,2,1};

​ 这种方法将创建、初始化和赋值同时进行,此时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 

如果这个时候再加上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

用一个数组初始化另一个数组

​ 注意!,两个数组都需要是vector数组。

替换成vector < int > v=test;效果是一样的。

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 (*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;

访问 vector 中的元素

特殊:

v.back() 返回 v 中最后一个元素的引用
v.front() 返回 v 中第一个元素的引用

at()

//使用at() 
arr.at(3); //vector中第三位的数值

获取 vector 的大小

v.size();

向 vector 中添加元素

v.push_back(100);

向 vector 中插入元素

​ 使用**insert()**函数来在指定位置插入元素。需要提供插入位置和要插入的元素值。

​ ?网上都说要用迭代器,我其实不太懂为什么一定要用迭代器呢?貌似也无所谓可以不用

v.insert(m, n, val) :在迭代器 m 之前插入 n 个值为 val 的元素,返回新添加的第一个元素的迭代器。

     //第一种格式用法
 
    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}

互换两个vector数组

v1.swap(v2);//互换两个vector

判断数组是否为空

arr.empty()//判断是否为空

删除 vector 中的元素(末尾)

​ 使用**pop_back()**函数删除 vector 末尾的元素,默认且只能删除末尾的元素

v.pop_back();

删除 vector 中的元素(指定位置)
使用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开始

删除 vector 中的元素(指定数值)

​ 使用**remove()**函数来删除指定值的元素。

   v .erase(remove(v.begin(), v.end(), 500), v.end()); //删除数值为500的元素

//remove的用法是将和传入的相同的放在尾端,最后返回的是指向第一个为500的迭代器,后面到尾指针全是500,再用erase范围删除
//另外就是remove_if函数,判断条件是传入一个lambda函数去判断,对应每个元素判断,返回true表明是要删除的,也是针对vector的
enemy_list.erase(std::remove_if(enemy_list.begin(), enemy_list.end(), [](const Enemy* enemy)
    {
        bool deletable = enemy->can_reomve();
        if (deletable) delete enemy;
        return deletable;
    }), enemy_list.end());

查找 vector 中的元素

使用**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;解释

清空 vector 中的元素

使用clear() 函数可以清空 vector 中的所有元素。

迭代器

vector<int>::iterator it
 
vector<int>::iterator it=v.begin();

vector 元素的重排操作(排序、逆序等)

排序 sort()

sort(v.begin(), v.end());

消除相邻的重复元素 unique()

​ 使用到的函数为 unique() :将输入序列相邻的重复项“消除”,返回一个指向不重复值范围末尾的迭代器。

​ 如果配合**sort()erase()**使用,可以达到去重的效果。先排序,再去重

需要头文件#include

    vector<int> v = { 1,20,3,4,50,6 };
    sort(v.begin(), v.end());  // 先排序
    v.erase(unique(v.begin(), v.end()), v.end());

逆序 reverse()

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;
}