当前位置:首页 » 《资源分享》 » 正文

vector的常规用法全解--C++系列

21 人参与  2024年11月10日 14:42  分类 : 《资源分享》  评论

点击全文阅读


        众所周知,不喜欢絮叨概念,直接上实操

        vector 不定长数组

头文件

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

#include <vector>

一维数组

 创建 vector 一维数组

        使用 vector 模板类来创建一个 vector 对象。可以创建存储特定类型元素的 vector,格式为: vector<数据类型> 名字。

vector<int> v;

初始化

        当我们新建一个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 

        貌似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 3vector<int> vector1(arr, arr + 3);for (int i = 0; i < vector1.size(); i++)cout << vector1[i] << " ";   cout << endl;//输出内容是:2 3vector<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 中第一个元素的引用

直接访问

cout << v[0]<< " ";

at()

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

获取 vector 的大小

v.size();

向 vector 中添加元素

v.push_back(100);

向 vector 中插入元素

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

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

vector<int> v = { 100,200,300,400,500,600 };v.insert(v.begin(), 1); //向索引为0的位置插入元素1//输出内容为:1 100 200 300 400 500 600for (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 600for (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 9for (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}

互换两个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()函数来删除指定值的元素。

if(在目标vector中找到该数值的元素)

        直接删除

else

        不做任何操作,不会报错

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

修改 vector 中的元素    

        直接修改

v[0]=1;

查找 vector 中的元素

使用find()函数来查找指定值的元素

vector<int> v = { 1,2,3,4,5,6 };vector<int>::iterator it = find(v.begin(), v.end(), 5);//输出内容为:目标元素的索引为: 4if (it != v.end()) {cout << "目标元素的索引为: " << distance(v.begin(), it) << endl;}else {cout << "没有找到" << endl;

清空 vector 中的元素

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

v.clear();

迭代器

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

使用foreach循环遍历

先空着以后补

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

排序 sort()

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

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

        使用到的函数为 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>

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

二维数组

创建vector二维数组

vector < vector < int > > v;

初始化

        和一维数组几乎一样,在这里仅用两样举一下例子。

v.resize(n)

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

指针

        先空着,这个不会


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/184283.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1