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.mzph.cn/web/5734.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Redis使用手册之Lua脚本》

《Redis使用手册之Lua脚本》 EVAL&#xff1a;执行脚本 127.0.0.1:6379> eval “return ‘hello world’” 0 “hello world” 127.0.0.1:6379> eval “return redis.call(‘set’,KEYS[1],ARGV[1])” 1 “message” “hello world” OK 127.0.0.1:6379> get message…

街道征迁项目档案管理系统

街道征迁项目档案管理系统是一个用于管理街道征迁项目档案的软件系统。该系统的主要功能包括档案录入、档案存储、档案检索、档案共享等。 系统的用户可以通过该系统录入征迁项目相关的档案信息&#xff0c;包括项目名称、征迁范围、土地面积、征迁补偿费用等。同时&#xff0c…

Python基础学习之编辑器

大家好&#xff0c;今天我想和大家分享一下Python中一个非常强大且优雅的特性——装饰器&#xff08;Decorators&#xff09;。装饰器在Python中是一种高级语法&#xff0c;它允许你在不修改函数或类的情况下&#xff0c;为其添加额外的功能。这不仅让代码更加整洁&#xff0c;…

搭建Kafka源码环境并测试

文章目录 一、前言二、环境准备三、环境搭建3.1 JDK 环境搭建3.2 Scala 环境搭建3.2.1 配置 Scala 环境变量3.2.2 验证 3.3 Gradle 环境搭建3.3.1 配置 Gradle 环境变量3.3.2 验证 3.4 Zookeeper 环境搭建3.4.1 配置 Zookeeper 环境变量3.4.2 验证 3.5 Kafka 源码搭建3.5.1 导入…

Codeforces Round 942 (Div. 2) ----- A ----- F --- 题解

前情提要&#xff1a;因为数学水平原因&#xff0c;没法给出e的证明&#xff0c;因为我也是举例归类得出的结论&#xff0c;但是按理来说应该可以利用生成数函数证明 f题也是因为数学原因加上水平有限&#xff0c;我的理解可能有偏差。 目录 A. Contest Proposal&#xff1a…

图像处理的一些操作(1)

图像处理 1.安装PIL&#xff0c;skimage库1.1导入skimage库中的oi模块和data模块 2.读取图像文件2.1读取图像文件2.2 以灰度模式读取图像2.3 查看示例图像的目录路径2.4 读取chelsea图片2.5 加载示例图片并保存2.6 获得加载图片的信息2.6.1 输出图片类型2.6.2 输出图片尺寸2.6.…

MySQL数据库练习(17)

schooldb库——utf8字符集——utf8_general_ci排序规则 81. DDL CREATE TABLE styles (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,styleSys varchar(20) DEFAULT NULL COMMENT 系统类型(home:PC),styleName varchar(255) NOT NULL COMMENT 风格名称,styleAuthor va…

企业网站必看——企业级OV SSL证书详细介绍

组织验证&#xff08;Organization Validation&#xff0c;简称OV&#xff09;SSL证书作为网络安全解决方案的重要组成部分&#xff0c;通过提供中级的安全保障和增强的网站身份验证&#xff0c;有效提升了网站的安全级别与用户信赖度。本文将深入探讨OV SSL证书的工作原理、申…

面试:Spring(IOC、AOP、事务失效、循环引用、SpringMVC、SpringBoot的自动配置原理、Spring框架常见注解)

目录 一、Spring的单例Bean是否是线程安全的&#xff1f; 二、什么是AOP 1、介绍 &#xff08;1&#xff09;记录操作日志 &#xff08;2&#xff09;实现Spring中的事务 三、spring中事务失效的场景有哪些&#xff1f; 1、异常捕获处理 2、抛出检查异常 3、非public方…

香港Web3,步履蹒跚

4月30日&#xff0c;6支香港虚拟资产现货ETF在香港交易所敲钟上市&#xff0c;正式迎来市场首秀。 而在前一周&#xff0c;香港证监会&#xff08;SFC&#xff09;官网就已列出华夏基金(香港)、博时国际和嘉实国际三家基金公司的比特币和以太坊现货ETF&#xff0c;并陆续披露了…

[ log日志画图]分割模型训练结束生成相关日志运用代码画图

文章目录 [ log日志画图]分割模型训练结束生成相关日志运用代码画图我的log文件&#xff1a;画图&#xff1a;1.loss1.1 loss是干嘛的1.2 代码1.3 生成图 2.DICE.IOU2.1 DICE,IOU是干嘛的(常规介绍)2.2 代码2.3 生成图小白tip [ log日志画图]分割模型训练结束生成相关日志运用代…

python 怎么调用R

如何在python中调用R&#xff1f;这其中包括了如何调用R的对象&#xff08;函数和包&#xff09;&#xff0c;R和python的对象如何互相转换&#xff0c;以及如何调用R的脚本&#xff08;外界参数的输入&#xff09;。python提供了一个模块rpy2&#xff0c;可以较好地完成这项工…

关于海康相机和镜头参数的记录

对比MV-CS020-10UC和大家用的最多的MV-CS016-10UC 其实前者适合雷达站使用&#xff0c;后者适合自瞄使用 一&#xff1a;MV-CS020-10UC的参数 二&#xff1a;对比 三&#xff1a;海康镜头选型工具

Java 基础重点知识-(泛型、反射、注解、IO)

文章目录 什么是泛型? 泛型有什么用?泛型原理是什么? Java 反射什么是反射? 反射作用是什么?动态代理有几种实现方式? 有什么特点? Java 注解什么是注解, 作用是什么? Java I/O什么是序列化?Java 是怎么实现系列化的?常见的序列化协议有哪些?BIO/NIO/AIO 有什么区别…

面试八股——HashMap

实现原理 红黑树是为了解决链表过长之后&#xff0c;查找时间过长的问题&#xff0c;将链表存储变为红黑树存储。 put方法的实现&#xff08;5⭐&#xff09; 相关属性&#xff1a; 1. 容量&#xff1a;初始容量为2^4。 2. 加载因子&#xff1a;初始值为0.75 上面两个属性的…

【面试经典 150 | 回溯】单词搜索

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;回溯 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行回顾…

Cloudflare高级防御规则 看看我的网站如何用防御的

网站已趋于稳定&#xff0c;并且经过nginx调优。我想先分享一下Cloudflare的WAF规则&#xff0c;因为这是最有效的防御之一&#xff0c;可以抵御大量恶意攻击流量&#xff0c;我已经验证了数月。 对于海外独立站电商网站&#xff0c;Cloudflare的CDN服务是首选&#xff0c;它强…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字&#xff0c;然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素&#xff0c;如果不用激活函数的话&#xff0c;无论神经网络有多少层&#xff0c;输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

代谢组数据分析七:从质谱样本制备到MaxQuant搜库

前言 LC-MS/MS Liquid Chromatography-Mass Spectrometry&#xff08;LC-MS/MS &#xff0c;液相色谱-质谱串联&#xff09;可用于残留化合物检测、有机小分子检测、鉴定和定量污染物以及在医药和食品领域添加剂检测和生物小分子等检测。 LC-MS/MS一般包含五个步骤&#xff…

50. 【Android教程】xml 数据解析

xml 是一种标记扩展语言&#xff08;Extension Mark-up Language&#xff09;&#xff0c;学到这里大家对 xml 语言一定不陌生&#xff0c;但是它在 Android 中的运用其实只是冰山一角。抛开 Android&#xff0c;XML 也被广泛运用于各种数据结构中。在运用 xml 编写 Android 布…