C++ 容器 Vector 的使用方法

目录
  • Vector简介
  • Vector 与数组
  • 创建 vector 的各种方法
  • 访问 vector 的元素
  • 删除元素

前言:

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

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

Vector简介

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

Vector 与数组

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

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

创建 vector 的各种方法

  • 创建一个 T 类型的空 vector
  • 创建时可以指定容量大小
  • 创建时不但可以指定容量大小,还可以指定元素初始值
  • 创建一个基于已有 vector 的拷贝
  • 基于数组来创建 vector
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);
	v5.push_back(11);

向一个 vector 中添加元素

	bool isEmpty = v1.empty();

访问 vector 的元素

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

两者的区别在于

  • operator[] 提供类似数组的存取方式,但不做边界是否越界检查,访问效率高
  • at() 进行边界检查,访问越界则抛出 exception 效率不容 operator[],这样开销比较大,因为我们用 c++ 主要还是要考虑到效率
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 为例说明

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

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

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 提供的信息来对元素进行清除。

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

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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ vector容器 find erase的使用操作:查找并删除指定元素

    概念:容器.迭代器.算法 STL包括容器.迭代器和算法: 容器 用于管理一些相关的数据类型.每种容器都有它的优缺点,不同的容器反映出程序设计的不同需求.容器自身可能由数组或链表实现,或者容器中的每个元素都有特殊的关键值. 迭代器 用于遍历一个数据集中的每个元素.这些数据集可能是容器或者容器的子集.迭代器的主要优点是它们为任意类型的容器提供一个小巧并且通用(注意通用很重要)的接口.例如,迭代器接口的一个操作是让它依次遍历数据集的每个元素.这个操作是依赖容器的内总部结构独立完成的.迭代器之所以有效是

  • C++ vector容器实现贪吃蛇小游戏

    本文实例为大家分享了C++ vector容器 实现贪吃蛇,供大家参考,具体内容如下 使用vector容器实现贪吃蛇简化了很多繁琐操作,且相比之前我的代码已经做到了尽量的简洁 技术环节: 编译环境:windows VS2019 需求: 控制贪吃蛇吃食物,吃到一个食物蛇身变长一节,得分增加,撞墙或撞自己则游戏结束. 思路: 创建一个vector容器,容器内存储蛇的每节身体的结构变量,结构变量中保存蛇身体的xy坐标,通过使用vector成员方法不断添加和删除容器中的数据,实现蛇坐标的规律移动,吃到食物

  • C++入门笔记之std::vector容器详解

    目录 前言 1. vector的构造函数原型: 2. vector的赋值函数原型: 3. vector的容量和大小函数原型: 4. vector的插入和删除函数原型: 5. vector的存取操作函数原型: 6. vector的呼唤容器函数原型: 总结 前言 vector实质是C++的一个类,与数组很相似,但是vector的优势是可以动态扩展,不需要考虑其内存大小. 定义: 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它

  • C++ STL中vector容器的使用

    目录 一.vector (1)区分size()和capacity() (2)迭代器失效 (3)区分const_iterator和constiterator (4)区分reserve()和resize() (5)push_back和emplace (6)关于原位构造(定位new+完美转发) 总结 一.vector (1)区分size()和capacity() size():返回容纳的元素个数 capacity():返回当前分配存储的容量 (2)迭代器失效 (3)区分const_iterator和c

  • C++中vector容器的注意事项总结

    目录 容量(capacity)和大小(size)的区别 容器扩容的本质 emplace_back()和push_back()的区别 emplace()和insert()的区别 附:如果vector是空的,并且没有分配空间,切忌用下标进行访问,会出错!!! 总结 容量(capacity)和大小(size)的区别 vector 容器的容量(用 capacity 表示),指的是在不分配更多内存的情况下,容器可以保存的最多元素个数:而 vector 容器的大小(用 size 表示),指的是它实际所包含的

  • c++容器list、vector、map、set区别与用法详解

    c++容器list.vector.map.set区别 list 封装链表,以链表形式实现,不支持[]运算符. 对随机访问的速度很慢(需要遍历整个链表),插入数据很快(不需要拷贝和移动数据,只需改变指针的指向). 新添加的元素,list可以任意加入. vector 封装数组,使用连续内存存储,支持[]运算符. 对随机访问的速度很快,对头插元素速度很慢,尾插元素速度很快 新添加的元素,vector有一套算法. map 采用平衡检索二叉树:红黑树 存储结构为键值对<key,value> set 采用

  • C++之vector容器的的声明初始化和增删改查

    C++vector容器 C++中有两种类型的容器:顺序容器和关联容器. 顺序容器主要有vector.list.deque等.其中vector表示一段连续的内存,基于数组实现,list表示非连续的内存,基于链表实现,deque与vector类似,但是对首元素提供插入和删除的双向支持. 关联容器主要有map和set.map是key-value形式,set是单值.map和set只能存放唯一的key,multimap和multiset可以存放多个相同的key. 容器类自动申请和释放内存,因此无需new和

  • C++ 容器 Vector 的使用方法

    目录 Vector简介 Vector 与数组 创建 vector 的各种方法 访问 vector 的元素 删除元素 前言: 我们都是带着问题学习,假设一个任务,也可以理解为一个问题,通过找解决方案来提升自己 c++ 的编程能力,尝试这是否一条好的路线,希望找到这种学习方式有效 问题简单描述一下,就是从以字符串,课程名称组成的集合中将一些包含特定文字,将其从列表中删除 Vector简介 Vector 是一个能够存放任意类型的动态数组,有点类似数组,是一个连续地址空间, Vector 与数组 Vec

  • C++(STL库)之顺序容器vector的使用

    一.特点 ①总的来说:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢 ②元素保存在连续的内存空间中,因此通过下标取值非常快 ③在容器中间位置添加或删除元素非常耗时 ④一旦内从重分配,和原vector相关的指针,引用,迭代器都失效.内存重分配耗时很长 二.头文件.using声明 头文件:#include <vector> using声明:using std::vector; 三.初始化 vector<T>  v1; ==>v1是一个空的vector ve

  • Java基础之容器Vector详解

    一.前言 知识补充:Arrays.copyOf函数: public static int[] copyOf(int[] original, int newLength) { int[] copy = new int[newLength]; System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } 可见copyOf()在内部新建一个数组,调用arrayCopy()将ori

  • C++顺序容器(vector、deque、list)的使用详解

    目录 一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库 二:STL组件 三:容器 四:类型成员 五:迭代器 六:顺序容器 七:顺序容器--向量(vector) 八:顺序容器--双端队列--deque 九:顺序容器 --列表--list 一:STL(Standard Template Library),即标准模板库,是一个高效的C++程序库 1.从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,基

  • C++模拟实现STL容器vector的示例代码

    目录 一.vector迭代器失效问题 二.模拟实现构造函数调用不明确 1.问题描述 2.解决调用不明确的方法 三.reserve中的深浅拷贝问题 1.reserve中浅拷贝发生原因 2.浅拷贝发生的图解 3.解决方法 四.模拟实现vector整体代码 一.vector迭代器失效问题 1.Visual Studio和g++对迭代器失效问题的表现 int main(){ std::vector<int>v{1,2,3,4}; std::vector<int>::iterator it

  • 在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

    介绍 Docker Swarm是用于部署Docker主机集群的Docker本地解决方案.您可以使用它来快速部署在本地计算机或受支持的云平台上运行的Docker主机集群. 在Docker 1.12之前,设置和部署Docker主机集群需要使用外部键值存储(如etcd或Consul)来进行服务发现.但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,可以开箱即用. 在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器

  • C++从文本文件读取数据到vector中的方法

    前言 大家应该都只奥vector(向量)是 C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.这篇文章介绍的是C++从文本文件读取数据到vector中的方法,下面话不多说,直接来看示例代码吧. 如题,要将如下文本文件读进vector中 示例代码如下 #include <iostream> using namespace std; #include <cmath> #include

  • iOS实现容器视图控制器的方法

    一直以来想写一个抽屉效果,看了一些文章后发现并不是那么简单,网上的一些抽屉效果不是很严谨.看了下MMDrawerController的源码,等于定制了一个Container View Controller.(类似于系统的UINavigationController以及UITabbarController); 比如下面几个方法就是MMDrawerController实现的: 下面的描述是官方文档帮助理解什么是容器控制器,文档中以UINavigationController和UISplitViewC

  • 修改已有docker容器中的内容方法

    一.docker ps    列出容器 二.docker cp   拷贝文件至容器 注:docker中宿主机与容器(container)互相拷贝传递文件的方法 1.从容器拷贝文件到宿主机 docker cp mycontainer:/opt/testnew/file.txt /opt/test/ 2.从宿主机拷贝文件到容器 docker cp /opt/test/file.txt mycontainer:/opt/testnew/ 需要注意的是,不管容器有没有启动,拷贝命令都会生效. 当结束后,

  • Docker 动态修改容器端口映射的方法

    前言:Docker端口映射往往是Docker Run命令时通过-p将容器内部端口映射到宿主机的指定端口上,一般来说容器的端口所对应的端口是提前确定需要映射的.但是有些情况下不得不需要临时映射端口,例如Docker中运行着MySQL容器,默认端口是不开放的.那么有什么办法可以让运行中的容器暴露指定的端口呢?客官请往下看---> 方法一:更改Docker配置文件(有风险) 通过修改Docker的配置文件来达到我们的目的,一般来说需要修改以下的文件config.v2.json和hostconfig.j

随机推荐