服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ 容器 Vector 的使用方法

C++ 容器 Vector 的使用方法

2022-12-15 14:26zidea C/C++

这篇文章主要介绍了C++ 容器 Vector 的使用方法,Vector 是一个能够存放任意类型的动态数组,有点类似数组,是一个连续地址空间,下文更多详细内容的介绍,需要的小伙伴可以参考一下

前言:

我们都是带着问题学习,假设一个任务,也可以理解为一个问题,通过找解决方案来提升自己 c++ 的编程能力,尝试这是否一条好的路线,希望找到这种学习方式有效

问题简单描述一下,就是从以字符串,课程名称组成的集合中将一些包含特定文字,将其从列表中删除

Vector简介

  • Vector 是一个能够存放任意类型的动态数组,有点类似数组,是一个连续地址空间,

Vector 与数组

  • Vector 是支持动态空间大小调整
  • 数组往往在定义需要指定固定大小
?
1
#include<vector>

要使用 vector 需要引入一下其头文件

创建 vector 的各种方法

  • 创建一个 T 类型的空 vector
  • 创建时可以指定容量大小
  • 创建时不但可以指定容量大小,还可以指定元素初始值
  • 创建一个基于已有 vector 的拷贝
  • 基于数组来创建 vector
?
1
2
3
4
5
6
vector<int> v1;
vector<int> v2(5);
vector<int> v3(5, 0);
vector<int> copyOf(v3);
int arr[] = { 1,2,3,5,7,9 };
vector<int> v5(arr, arr + 6);
?
1
v5.push_back(11);

向一个 vector 中添加元素

?
1
bool isEmpty = v1.empty();

访问 vector 的元素

  • 调用 vector::at()
  • 调用 vector::operator[]

两者的区别在于

  • operator[] 提供类似数组的存取方式,但不做边界是否越界检查,访问效率高
  • at() 进行边界检查,访问越界则抛出 exception 效率不容 operator[],这样开销比较大,因为我们用 c++ 主要还是要考虑到效率
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<wstring> v;
v.reserve(10);
 
for (size_t i = 0; i < 3; i++) {
        wstringstream wss;
        wss << "[" << i << "]" << endl;
        v.push_back(wss.str());
}
try
{
        wstring wsz = v.at(5);
}
catch (const std::exception& ex)
{
        cout << ex.what() << endl;
}

删除元素

  • clear 清除整个 vector
  • pop_back:弹出 vector 末尾元素
  • erase: 删除 vector 中某一位置的元素

使用 erase 来删除某一个位置元素,可以指定 iterator 来删除某一个元素,也可以通过条件函数找到 vector 中需要删除的元素,这里 remove_if 为例说明

?
1
2
3
4
5
6
7
8
vector<string> tuts;
tuts.push_back("machine learning basic tutorial");
tuts.push_back("deep learning basic tutorial");
tuts.push_back("transformer tutorial");
 
for (int i = 0; i < tuts.size(); i++) {
        cout << tuts[i] << endl;
}

首先我们需要集合来承载这些字符串,这里我选择了 vector 作为容器,这样就得到了一个集合 tuts

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vector<string> tuts;
tuts.push_back( "machine learning basic tutorial" );
tuts.push_back("deep learning basic tutorial");
tuts.push_back("transformer tutorial");
 
for (int i = 0; i < tuts.size(); i++) {
    cout << tuts[i] << endl;
    string::size_type idx;
    idx = tuts[i].find("basic tutorial");
 
    if (idx == string::npos) {
 
            cout << "Not Found" << endl;
    }
    else {
            cout << "Found" << endl;
    }
}

这里定义这个函数 isContainsBasicTut ,这个代码是不是让大家联想到 map,这个函数通常会接受一个数组元素做输入,返回一个 bool 类型值,满足一定条件返回 true

?
1
2
3
4
5
6
7
8
9
10
11
bool isContainsBasicTut(string tutName) {
    string::size_type idx;
    idx = tutName.find("basic tutorial");
    if (idx == string::npos) {
 
        return false;
    }
    else {
        return true;
    }
}

然后可以调用 tuts 的 erase 也就是 vector 的删除方法,这里 remove_if 方法并不会实际移除序列中的元素,只是将符合条件元素移动到容器末尾并返回指向第一个移除元素的位置的迭代器,接下来 erase 对 vector 容器中根据 remove_if 提供的信息来对元素进行清除。

?
1
2
3
4
5
6
7
8
9
10
vector<string> tuts;
tuts.push_back( "machine learning basic tutorial" );
tuts.push_back("deep learning basic tutorial");
tuts.push_back("transformer tutorial");
 
tuts.erase( remove_if(tuts.begin(), tuts.end(), isContainsBasicTut), tuts.end());
 
for (int i = 0; i < tuts.size(); i++) {
        cout << tuts[i] << endl;
}

接下来我们再通过一例子来看在实际开发中如何使用 if_remove

?
1
2
3
4
5
6
7
8
9
10
11
12
13
bool isOdd(int num) {
    return ((num % 2) == 1);
}
 
int main()
{
    vector<int> nums{ 1, 2, 3, 10, 12, 15, 17, 20 };
    remove_if(nums.begin(), nums.end(), isOdd);
    for (vector<int>::iterator it = nums.begin(); it != nums.end(); it++)
            cout << *it << "\t";
 
    return 0;
}

首先还是定义

到此这篇关于C++ 容器 Vector 的使用方法的文章就介绍到这了,更多相关C++ 容器Vector内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7105572360907915277

延伸 · 阅读

精彩推荐
  • C/C++C/C++程序设计的基本概念详解

    C/C++程序设计的基本概念详解

    这篇文章主要介绍了C++程序设计的基本概念详解,文中有非常详细的C语言使用教程及相关基础知识,对正在学习c语言的小伙伴们有非常好的帮助,需要的朋友...

    weixin_388989445192022-01-12
  • C/C++C++的指针,引用和STL详解

    C++的指针,引用和STL详解

    这篇文章主要为大家详细介绍了C++的指针,引用和STL,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    jiangchao988422022-09-29
  • C/C++C++实现LeetCode(104.二叉树的最大深度)

    C++实现LeetCode(104.二叉树的最大深度)

    这篇文章主要介绍了C++实现LeetCode(104.二叉树的最大深度),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang4232021-12-01
  • C/C++OpenCV 图像金字塔的实现示例

    OpenCV 图像金字塔的实现示例

    本文将结合实例代码,介绍OpenCV 图像金字塔,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...

    qq_423441328492021-11-19
  • C/C++C语言 一级指针与二级指针详细介绍

    C语言 一级指针与二级指针详细介绍

    这篇文章主要介绍了C语言 一级指针与二级指针详细介绍的相关资料,需要的朋友可以参考下...

    一米王子3912021-04-18
  • C/C++详解C++ 转换的非正式分类

    详解C++ 转换的非正式分类

    C++ 正式分类方法是直接按语法分类,分为:隐式转换和显示转换。这篇文章主要介绍了C++ 转换的非正式分类,需要的朋友可以参考下...

    mkckr010742022-09-01
  • C/C++深入C++ 函数映射的使用详解

    深入C++ 函数映射的使用详解

    我比较喜欢用代码结合实际来讲解,下面我将以一段事例代码来讲解如何使用这几种映射...

    C语言教程网3762020-12-18
  • C/C++详解C语言结构体的定义和使用

    详解C语言结构体的定义和使用

    这篇文章主要为大家介绍了C语言结构体的定义和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    女孩脸红了11732022-07-31