c++容器与算法概述

容器与算法

  • 每个标准库容器都提供了begin() end() 函数,分别返回容器的头部位置和尾部位置。

I/O 流

对于自定义的类型:

struct Entry {
    std::string name;
    int number;
    
};

如果需要使用标准输出需要重载<< 运算符,特别注意: 这个函数不是定义在Entry 类型内部的, 形式如下:

// 定义entry 类的输出函数,重载operator<<
std::ostream& operator<<(std::ostream& os, const Entry& e) {
        return os<<"{\"" << e.name << "\"," << e.number<< "}";
}

对于自定义类型,如果需要使用sort 算法函数,需要重载比较运算符<, 否则会编译报错:

// 只有定义了比较运算符,才能使用sort 进行排序,否则编译会报:
bool operator<(const Entry& a, const Entry& b) {
	return a.number <= b.number;
}

测试代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include "config.h"
#include "entry.h"

int main(int argc, char **argv) {
	std::vector<Entry> mEntries;
	mEntries.push_back({"zhangsan", 1});
	mEntries.push_back({"lisi", 2});
	mEntries.push_back({"wangwu", 3});
	std::sort(mEntries.begin(), mEntries.end());
	for(const auto & entry : mEntries) {
		std::cout<< "entry: " << entry << std::endl;
	}

	// use operator << of struct Entry
	// std::cout << "chapter4 entry: " << entry << std::endl;;
	std::cout << "Version " << chapter4_VERSION_MAJOR << "." << chapter4_VERSION_MINOR << std::endl;
	return 0;
}

容器

  • 目的是保存一些对象

  • vector

    • 是元素类型为T 的容器
    • 不进行范围检查
  • list

    • 双向链表
  • list & vector

    • 当数据量教小时,vector 的性能会优于list
  • map 关联数组或字典 通常用平衡二叉树实现。

    • 值对的容器
    • 支持下标操作,下标是key, 返回的是value, 本质是一次查找动作
    • 搜索map 的时间代价是O(log(n))
  • unordered_map 哈希容器 “无序” 容器

  • 容器类大多提供了: begin() end() push_back, size() 等函数。

  • 使用标准库, 同我们大多数自己实现的库函数类似,需要平衡效率等,斟酌使用。

算法

  • 对于容器类,find() 函数通过返回end() 来表示未找到
find(s.begin(), s.end(), c) != s.end()  用来判断在s 中是否查找到c

迭代器

  • 对于使用迭代器的场合
  for (auto p : s) {

  }
  // 此时的auto p 需要根据使用场合来确定是否使用const &
  // (1) for (const auto& p : s)  只会读取,不会进行拷贝,也不会修改s 中的元素
  // (2) for (const auto p : s)  需要拷贝元素,但不可修改拷贝出来的值
  // (3) for (auto p : s)  拷贝一份s元素,而不会改变s中元素
  // (4) for (auto& p : s)  不会拷贝一份s 元素, 可以修改s 中的元素

  
  • 返回迭代器
const std::vector<std::string::iterator> find_all(std::string&s, char c) {
	std::vector<std::string::iterator> res;
	for (auto p = s.begin(); p != s.end(); ++p) {
		if (*p == c) {
			res.push_back(p);
		}
	}
	return res;
}
  • 使用模板
    • 迭代器 和标准算法库在所有标准库容器上的工作方式是相同的,所以可以对于迭代起的使用进行泛化
// 使用模板
// 需要注意iterator 的声明方式,前面有个typename
template<typename C, typename V>
std::vector<typename C::iterator> find_all(C& s, V v) {
	std::vector<typename C::iterator> res;
	for (auto p = s.begin(); p != s.end(); ++p) {
		if (*p == v) {
			res.push_back(p);
		}
	}
	return res;
}

如果觉得typename C::iterator 方式太丑, 可以采用如下形式
template<typename T>
using Iterator = typename T::iterator; // T  的迭代器
// P90 使用的是
// using Iterator<T> = typename T::iterator; // T  的迭代器 , 编译不过??
template<typename C, typename V>
std::vector<Iterator<C>> find_all(C& s, V v) {
	std::vector<Iterator<C>> res;
	for (auto p = s.begin(); p != s.end(); ++p) {
		if (*p == v) {
			res.push_back(p);
		}
	}
	

  • baidu 的时候,发现可以使用typedef 给类型其别名:
template<typename T>
typedef typename T::iterator Iterator;

但是发现会编译失败:
在这里插入图片描述

  • baidu 的解释 以及解决办法
    在这里插入图片描述

  • 综上, 在使用模板的时候,还是老实的使用“using" 进行重命名吧

算法概述

  • 算法提供了很多有用的方法, find count, replace (居然还有这个接口)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/588439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ICMP详解

3 ICMP ICMP&#xff08;Internet Control Message Protocol&#xff0c;因特网控制报文协议&#xff09;是一个差错报告机制&#xff0c;是TCP/IP协议簇中的一个重要子协议&#xff0c;通常被IP层或更高层协议&#xff08;TCP或UDP&#xff09;使用&#xff0c;属于网络层协议…

结构分析的有限元法及matlab实现(徐荣桥)|【PDF教材+配套案例Matlab源码】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

用栈实现队列——leetcode刷题

题目要求我们只用栈的基本操作 push to top 入栈&#xff0c;peek from top 返回栈顶元素&#xff0c;pop from top 移除并返回栈顶元素&#xff0c;size 栈的大小&#xff0c;is_empty 判断栈是否为空&#xff0c;这几个函数来实现队列&#xff0c;也就是说&#xff0c;我们在…

Linux字符设备驱动-详解与实操:驱动架构、设备树、Pinctrl子系统和GPIO子系统、platform、设备树下的platform

如何编写一个驱动程序&#xff1a; &#xff08;1&#xff09;确定主设备号 &#xff08;2&#xff09;定义自己的file_operations结构体&#xff1a; 包含对应的open(drv_open)/read(drv_read)等设备操作函数&#xff0c;需要到内核中去注册 &#xff08;3&#xff09;实现…

OpenAI最大对手推出iOS版APP 以期与ChatGPT展开竞争 | 最新快讯

财联社 5 月 2 日讯&#xff08;编辑牛占林&#xff09;美东时间周三&#xff0c;人工智能(AI)初创公司 Anthropic 宣布推出一款免费的移动端应用程序(APP)&#xff0c;不过目前仅有 iOS 版本。 这款应用名为 Claude&#xff0c;与 Anthropic 的大模型系列名字相同。Anthropic …

基于Python的在线学习与推荐系统设计与实现(论文+源码)-kaic

题目&#xff1a;在线学习与推荐系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本在线学习与推荐系统就是在这样的大环境下诞生&#xff0…

macbook文件管理,这款神器不得不说 macbook文件管理技巧 macbookpro文件管理软件

使用MacBook办公就是看重高效的特点&#xff0c;但很多时候随着使用时间的增长&#xff0c;MacBook上的文件也会越来越多&#xff0c;如果没有很好的管理方式&#xff0c;只会给日常的使用造成诸多不便。如何更好的搞定macbook文件管理呢&#xff0c;且看下面几个方法&#xff…

新势力4月交付量比拼:理想超问界夺冠,小米首月交付超七千辆 | 最新快讯

理想汽车超越问界夺下 4 月新势力交付量冠军。 5 月 1 日&#xff0c;各大造车新势力纷纷亮出最新成绩。新入局者小米汽车也准时发布了交付数据&#xff0c;在交付首月&#xff0c;同时又是非完整交付月&#xff0c;小米就交出了超七千辆的好成绩&#xff0c;在造车新势力中尚属…

ngrinder项目-本地调试遇到的坑

前提-maven mirrors配置 <mirrors><!--阿里公有仓库--><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</ur…

【计算机网络】网络层总结

目录 知识梗概 IP地址 子网划分 IP包头格式 路由 网络层协议 ARP病毒/ARP欺骗 知识梗概 IP地址 IP相关介绍&#xff1a;机器之间需要交流&#xff0c;必须要一个地址才能找到对应的主机&#xff0c;IP地址是主机的一种表示&#xff0c;保证主机之间的正常通信&#xff…

1083 是否存在相等的差

solution 输出的是重复的差值&#xff0c;而非全部差值 #include<iostream> #include<algorithm> using namespace std; const int maxn 1e4 10; int flag[maxn] {0}; int main(){int n, x;scanf("%d", &n);for(int i 1; i < n; i){scanf(&…

STM32 串口IDLE接收空闲中断+DMA

参考 http://t.csdnimg.cn/fAV38 1.基础知识 STM32 IDLE 接收空闲中断 功能&#xff1a; 在使用串口接受字符串时&#xff0c;可以使用空闲中断&#xff08;IDLEIE置1&#xff0c;即可使能空闲中断&#xff09;&#xff0c;这样在接收完一个字符串&#xff0c;进入空闲状态时&…

分布式与一致性协议之Raft算法(一)

Raft算法 概述 Raft算法属于Multi-Paxos算法&#xff0c;它在兰伯特Multi-Paxos思想的基础上做了一些简化和限制&#xff0c;比如日志必须是连续的&#xff0c;只支持领导者(Leader)、跟随者(Follwer)和候选人(Candidate)3种状态。在理解和算法实现上&#xff0c;Raft算法相对…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.5--I.MX6U启动方式

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

想要吃瓜,就要学会,在不必要的冲突发生时,沉默就是一种智慧——早读(逆天打工人爬取热门微信文章解读)

练习一下怼人的本事 引言Python 代码第一篇 洞见 养生的尽头&#xff0c;是养格局第二篇 人民日报 来啦 早班新闻车要闻社会 政策结尾 沉默是智者的选择 在不必要的冲突面前 选择沉默是一种智慧 引言 昨天下午睡醒 看到群里有些言论 遂 battle了一波 给大家吃吃瓜 到中午 车…

Codeforces Round 941 (Div. 2) D. Missing Subsequence Sum

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5; c…

网络安全之弱口令与命令爆破(中篇)(技术进阶)

目录 一&#xff0c;什么是弱口令&#xff1f; 二&#xff0c;为什么会产生弱口令呢&#xff1f; 三&#xff0c;字典的生成 四&#xff0c;使用Burpsuite工具验证码爆破 总结 笔记改错 一&#xff0c;什么是弱口令&#xff1f; 弱口令就是容易被人们所能猜到的密码呗&a…

MyBatis中的#{} 和 ${}

目录 #{} 和 ${} 预编译 SQL 和 即时 SQL SQL注入 ${}的使用 #{} 和 ${}的使用 MyBatis参数赋值有两种方式&#xff0c;在上一篇文章中&#xff0c;一直使用 #{} 进行赋值&#xff0c;接下来&#xff0c;我们来使用 ${} 进行赋值&#xff0c;并观察 #{} 和 ${} 的区别 使用…

2024年外贸企业邮箱最新排名

外贸企业在与客户沟通中的重要工具就是企业邮箱&#xff0c;那么外贸企业邮箱哪个比较好呢&#xff1f;本文聚焦2024年外贸企业邮箱市场的最新动态&#xff0c;通过对五个领先品牌的深度对比&#xff0c;旨在为企业决策者提供详尽参考。首当其冲的是备受瞩目的Zoho Mail企业邮箱…

JMeter性能压测脚本录制

第一步&#xff1a;电脑打开控制面板设置代理服务器 第二步&#xff1a;jmeter的测试计划添加一个HTTP&#xff08;S&#xff09;脚本记录器 在脚本记录器里配置好信息&#xff0c;然后保存为脚本文件&#xff08;.*表示限定&#xff09; 此方框内容为项目地址&#xff08;可改…
最新文章