【STL】vector快速上手

这篇具有很好参考价值的文章主要介绍了【STL】vector快速上手。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一,vector的模板特性

二,vector基本使用

1. 构造函数

2. operator=  赋值

3. vector——增删

A,  尾插 && 尾删 

B,insert

C,  erase 

4. 访问vector

遍历vector中元素:

法一:数组[]法  || at法

法二:迭代器法

语法糖——for 

三,应用

1. 排序

2. vector + string


一,vector的模板特性

      STL中的vector是一个动态数组容器,它可以存储任意类型的元素。vector的模板构造函数可以通过不同的参数来实现不同的初始化方式。

从STL中就会发现:

【STL】vector快速上手,C++——从入门到入土,安排!,c++,开发语言

    vector<int> s1;
    vector<double> s2;
    vector<char> s3;

    vector<string> s4   // 数据类型是string类

二,vector基本使用

1. 构造函数

常见的有:

    vector<int> s1;         // 设置一个不包含任何元素的空对象
	vector<int> s2(3);      //设置3个初始值为默认值的vector对象
	vector<int> s3(3, 20);  // 三个初始值为20的vector对象
	// 以及还有迭代器的函数,这里留到讲解vector迭代器再讲
	vector<int> s4(s3);     // 拷贝构造

结果:

【STL】vector快速上手,C++——从入门到入土,安排!,c++,开发语言

2. operator=  赋值

vector<int> s5 = s3;    // vector对象之间的赋值

3. vector——增删

      vector中没有头插 && 头删,相应的有insert(插入) && erase(删除) 

A,  尾插 && 尾删 

 // 添加数据的值
    s1.push_back(10);  // 添加一个数据10
    s1.push_back(20);
    s1.push_back(30);
    s1.pop_back();  // 删除尾部元素
    s1.pop_back();

B,insert

 vector<int> s1; 
 s1.push_back(10);
 s1.push_back(10);
 s1.push_back(30);
 s1.push_back(21);
 vector<int>::iterator pos =  find(s1.begin(), s1.end(), 20);
	if (pos != s1.end()) //find()函数如果没有匹配的化会返回最后一个有效数据的下一个位置,
	 //                      没有判断则尾插,不符合判断插入的逻辑。
	{
		s1.insert(pos, 100); // pos为插入位置的迭代器,100则是插入值
	}

	for (auto i : s1)
	{
		cout << i << " ";
	}

// 结果是 10 10 30 21

 (注意:find()算法函数包含在 algorithm 头文件中)

C,  erase 

共两种,一个是删除单个元素,一个则是范围删除,都是通过迭代器进行操作。

v1.erase(v1.begin() + 3);  // 删除第三个元素
v1.erase(v1.begin(), v1.end() - 1);  // 删除前v1.end() - 1个元素

4. 访问vector

常见的:

    s1[0];
	s1[2];
	s1.front();  // 返回头元素引用
	s1.back();   // 返回尾元素引用

遍历vector中元素:

法一:数组[]法  || at法

    s1.push_back(10);
	s1.push_back(20);
	s1.push_back(30);

	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << endl; // s1[i]可换成s1.at(i)后者用的少
        // 都是返回数据的引用
	}

法二:迭代器法

    vector<int>::iterator it = s1.begin();
	while (it != s1.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

语法糖——for 

同时,支持迭代器也支持语法糖for,其底层会被替换为迭代器。

挪:

for (auto i : s1)
	{
		cout << i << endl; 
	}

其访问结果跟迭代器一模一样。

三,应用

  前面我们了解了vector的使用,学过string类会发现vector没有什么特别新颖的地方。这里我们来做一些小知识点扩展。

1. 排序

这里用到STL中排序算法函数 sort() 

【STL】vector快速上手,C++——从入门到入土,安排!,c++,开发语言

如你所见,sort函数通过函数模板实现功能,而其底层使用的是快排算法

如下:

    vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(21);
	v1.push_back(32);
	sort(v1.begin(), v1.end());
	for (auto e : v1)
	{
		cout << e << " ";
	}
	// 升序:10 20 21 30 32 40

sort函数默认为升序,那如何改为降序呢?

【STL】vector快速上手,C++——从入门到入土,安排!,c++,开发语言

 使用第二个重载函数如下:

    vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	v1.push_back(21);
	v1.push_back(32);

	sort(v1.begin(), v1.end());
	for (auto e : v1)
	{
		cout << e << " ";
	}
	cout << endl;

	// 升序:10 20 21 30 32 40
    
    // 库函数中有两个仿函数
	less<int> ls;  // 默认的升序就是他
	greater<int> gt; // 降序
	sort(v1.begin(), v1.end(), gt);
	for (auto e : v1)
	{
		cout << e << " ";
	}
    //降序:40 32 30 21 20 10

当然网络上也有这样的简易写法:

  sort(v1.begin(), v1.end(), greater<int>());

而这里用到了匿名对象(less 与 greater是类)。

2. vector + string

    我们知道vector是泛性编程,那么当数据类型为自定义类型呢?  如:string类时,会有怎样的不同?

 代码如下:

    vector<string> strv;
	string s1 = "张三";
	strv.push_back(s1);  // 调用拷贝构造
	strv.push_back(string("张三"));  // 使用了匿名对象,具有临时对象的性质(const string)
	// 本质上string使用了拷贝构造,操作还是比较繁琐。
	strv.push_back("张三");  // 大部分时候是这样一种写法,使用了string的构造

好,下面我们来用范围for 进行 遍历输出,请看下面代码,是否有不合理的地方?

int main()
{
	vector<string> strv;
	string s1 = "张三";
	strv.push_back(s1);  // 调用拷贝构造
	strv.push_back(string("张三"));  // 使用了匿名对象,具有临时对象的性质(const string)
	// 本质上string使用了拷贝构造,操作还是比较繁琐。
	strv.push_back("张三");  // 大部分时候是这样一种写法,使用了string的构造

	for (auto str : strv)
	{
		cout << str << endl;
	}
	return 0;
}

解析:应为 auto&  str  :  strv 。我们知道这次vector容器中的数据是string类,而范围for的功能是将strv中的数据赋值给str, string类赋值给string类这不是拷贝构造吗?那么每次赋值都是深拷贝,性能大浪费,所以应为auto& str : strv(如果严谨一些:不能修改数据,前面用const修饰) 

这里有一个使用关于vector的算法题:118. 杨辉三角

补充:vector的双括号

【STL】vector快速上手,C++——从入门到入土,安排!,c++,开发语言

 从本质来说,下标双括号是调用了两次函数调用

以上vector常见的用法,如果想要继续了解其他用法,需要查看文档:Reference - C++ Reference (cplusplus.com) 

结语

本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论;如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力。文章来源地址https://www.toymoban.com/news/detail-558016.html

到了这里,关于【STL】vector快速上手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 零基础快速上手HarmonyOS ArkTS开发1---运行Hello World、ArkTS开发语言介绍

    在华为开发者大会2023年8月4日(HDC.Together)大会上,HarmonyOS 4正式发布,其实在2021年那会学习了一点鸿蒙的开发: 不过因为现在的鸿蒙手机完全兼容Android应用,所以学习动力也不是很足,一直就搁置了,直到今年华为官方出了这么一则消息才让我对于学习它有一种紧迫感了,如

    2024年02月05日
    浏览(50)
  • 【C++入门到精通】C++入门 —— vector (STL)

    前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关

    2024年02月13日
    浏览(48)
  • STL标准模板库 vector容器与迭代器入门

    vector 就是一个连续的数据 C++11 std::vector a ={1,4,2,6,7}; 可以使用花括号来定义 容器的功能就是存储数据 迭代器的功能就是指向数据,并且可以实现前后移动(指针)算法和容器的接口的存在 vector功能是长度可变的数组, 身在栈上 里面的数据存储在堆上 因为栈不可动态扩容

    2023年04月23日
    浏览(47)
  • 【C++入门】STL容器--vector底层数据结构剖析

    目录  前言  1. vector的使用       vector的构造  vector迭代器  vector空间相关的接口  vector 功能型接口  find  swap  insert  erase 2. vector内部数据结构剖析 reserve  push_back和pop_back size、capacity、empty、operator[ ];  insert和erase resize swap  拷贝构造和赋值重载 构造函数补充  迭代器

    2024年01月25日
    浏览(56)
  • 【C语言】字符与字符串---从入门到入土级详解

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 一.字符类型和字符数组(串)简介 1.ASCII 2.定义,初始化,使用 1字符的定义及初始化 2字符串的定义及初始化 二.字符 1.字符的输入与输出 2.常见字符操作函数    1字符大小写转换    2字符类型

    2024年03月17日
    浏览(46)
  • 自然语言处理从入门到应用——LangChain:快速入门-[快速开发聊天模型]

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月15日
    浏览(44)
  • LLMOps快速入门,轻松开发部署大语言模型

    大家好,如今我们能够与ChatGPT进行轻松互动:只需输入提示,按下回车,就能迅速得到回应。然而,这个无缝互动的底层,是一系列复杂而有序的自动执行步骤,即大型语言模型运营(LLMOps),确保用户的提示有效传递和处理,并在几秒内生成精准、可靠的回答。 本文将分

    2024年04月09日
    浏览(38)
  • 以太坊智能合约开发:Solidity 语言快速入门

    在本文中,我们从一个简单的智能合约样例出发,通过对智能合约源文件结构的剖析与介绍,使大家对Solidity语言有一个初步的认识。最后,我们将该智能合约样例在 Remix 合约编译器中编译、部署,观察其执行结果。 在开始之前,我们先对Solidity有个初步的了解,即Solidity是

    2023年04月09日
    浏览(51)
  • 【HarmonyOS北向开发】-03 ArkTS开发语言-TypeScript快速入门

     飞书原文链接:Docs

    2024年02月12日
    浏览(50)
  • HarmonyOS第一课ArkTS开发语言(TypeScript快速入门)

    ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等相应的能力,让开发者以更简洁、更自然的方式开发跨端应用。要了解什么是ArkTS,我们首先要了解下ArkTS、TypeScript和JavaScript之间的关系: JavaScript是一种属

    2024年02月05日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包