自定义string类
#include <iostream>
#include <string> int main() { std::string str = "Hello, World!"; // 使用 c_str() 将 std::string 转换为 C 风格字符串,并传递给 printf printf("The string is: %s\n", str.c_str()); // 尝试修改返回的 C 风格字符串(错误示例,不应这样做) // char* cstr = str.c_str(); // cstr[0] = 'h'; // 未定义行为,因为 cstr 指向的内存是常量 return 0;
}
#include <iostream>
#include <string.h>
#include <cstring>
using namespace std;
class String {
public:String();String(const char *pstr);String(const String& rhs);String &operator=(const String &rhs);~String();void print();size_t length() const;const char* c_str() const;private:char *_pstr;
};String::String() : _pstr(new char[1]) {_pstr[0] = '\0'; // 初始化为空字符串
}
String::String(const char *pstr) : _pstr(new char[strlen(pstr) +1]) {strcpy(_pstr,pstr);
}String::String(const String& rhs) : _pstr(new char[strlen(rhs._pstr) + 1]) {strcpy(_pstr, rhs._pstr);
}
String& String::operator=(const String &rhs) {if (this != &rhs) {delete[] _pstr; // 释放旧资源_pstr = new char[strlen(rhs.c_str()) + 1]; // 分配新资源strcpy(_pstr, rhs.c_str()); // 复制内容}return *this; //String(const String& rhs) 返回对象的引用
}
const char* String::c_str() const {return this->_pstr;
}
size_t String::length() const {return strlen(_pstr);
}
void String::print() {std::cout << _pstr << std::endl;
}
String::~String() {if (_pstr) {delete[] _pstr;}
}int main(){String str1("123");str1.print();}int main() {String str1("123");str1.print();std::cout << str1.length() << std::endl;return 0;
}
#include <iostream>
#include <vector>template<typename T>
class SimpleStack {
public:// 添加元素到栈顶void push(T&& item) {data_.emplace_back(std::forward<T>(item));}// 移除栈顶元素并返回它的值T pop() {if (data_.empty()) {throw std::out_of_range("pop from empty stack");}T topItem = std::move(data_.back());data_.pop_back();return topItem;}// 返回栈顶元素,不移除const T& top() const {if (data_.empty()) {throw std::out_of_range("top from empty stack");}return data_.back();}// 检查栈是否为空bool empty() const {return data_.empty();}// 返回栈中的元素数量size_t size() const {return data_.size();}private:std::vector<T> data_; // 使用std::vector作为底层容器存储数据
};// 测试SimpleStack功能的小程序
int main() {SimpleStack<int> intStack;intStack.push(1);intStack.push(2);intStack.push(3);std::cout << "Top element is: " << intStack.top() << std::endl;std::cout << "Popped element is: " << intStack.pop() << std::endl;std::cout << "New top element is: " << intStack.top() << std::endl;return 0;
}
这个push
函数的设计利用了C++11引入的右值引用(rvalue reference)和完美转发(perfect forwarding)技术。让我们一步一步来看这个函数的细节:
void push(T&& item) {data_.emplace_back(std::forward<T>(item));
}
1. **右值引用 (Rvalue Reference)**:
- `T&& item` 这个声明表示`item`是一个右值引用,它可以绑定到一个右值(即临时对象)或者一个左值(普通的命名对象)。右值引用的存在主要是为了支持移动语义(move semantics),使得我们可以更高效地处理临时对象而不必进行拷贝构造。
2. **完美转发 (Perfect Forwarding)**:
- `std::forward<T>(item)` 这个函数的作用是完美地将`item`转发给`data_.emplace_back`。如果`item`是一个右值(例如,当`push`被调用时传递了一个临时对象),`std::forward`会保留其右值性质;如果`item`是一个左值,那么它会被转发为左值。
- 这种技术被称为“完美转发”,因为它允许我们将`push`函数的参数原封不动地传递给`emplace_back`,无论这个参数最初是以何种形式传递给`push`的。
3. **`emplace_back`**:
- `std::vector` 类的一个成员函数,它在容器尾部直接构造一个新的元素。这比使用`push_back`更高效,因为`push_back`通常需要先创建一个临时对象再将其移动到容器中,而`emplace_back`则是在容器中直接构造对象,省去了临时对象的创建和移动。
为什么这么做?
- **性能**: 对于那些具有昂贵拷贝构造函数的对象,或者当传递的对象是临时对象时,使用右值引用和完美转发可以避免不必要的拷贝,从而提高性能。
- **灵活性**: 它使得函数能够接收任意类型的对象——无论是临时对象还是已经存在的对象——并且以最有效的方式处理它们。
总的来说,这种设计方式让我们的`push`函数更加通用且高效,尤其是在处理大型对象或者资源密集型对象时。
vector常用的函数:
`std::vector` 是C++标准库中的一个非常强大的容器,用于存储动态大小的数据集合。它提供了许多实用的成员函数,这些函数可以帮助我们方便地管理数据。下面是一些`std::vector`常用的成员函数及其用途简介:
1. **构造与初始化**
- `vector()`: 默认构造函数,创建一个空的`vector`。
- `vector(n, val)`: 创建一个含有`n`个`val`值的`vector`。
- `vector(const vector& v)`: 复制构造函数,创建一个与`v`相同的新`vector`。
- `vector(std::initializer_list<value_type> il)`: 使用一个初始化列表来初始化`vector`。
2. **容量**
- `size()`: 返回`vector`中的元素数量。
- `empty()`: 如果`vector`为空,则返回`true`。
- `max_size()`: 返回`vector`可能达到的最大大小。
- `capacity()`: 返回当前`vector`的容量,即它可以容纳的元素数量。
- `reserve(size_type new_cap)`: 请求改变`vector`的容量,使其至少为`new_cap`。
3. **元素访问**
- `operator[]`: 使用索引来访问元素。
- `at(size_type pos)`: 访问指定位置的元素,并检查索引是否越界。
- `front()`: 访问第一个元素。
- `back()`: 访问最后一个元素。
- `data()`: 返回指向容器中第一个元素的指针。
4. **修改器**
- `push_back(const value_type& val)`: 在`vector`末尾添加一个元素。
- `emplace_back(Args&&... args)`: 在`vector`末尾直接构造一个元素。
- `pop_back()`: 移除最后一个元素。
- `insert(iterator position, const value_type& val)`: 在`position`前插入一个元素。
- `insert(iterator position, n, val)`: 在`position`前插入`n`个`val`值。
- `insert(iterator position, std::initializer_list<value_type> il)`: 使用初始化列表来插入元素。
- `erase(iterator position)`: 删除`position`所指向的元素。
- `erase(iterator first, iterator last)`: 删除`[first, last)`区间内的元素。
- `assign(std::initializer_list<value_type> il)`: 使用初始化列表重置`vector`的内容。
- `clear()`: 移除所有元素。
5. **交换与释放**
- `swap(vector& v)`: 与另一个`vector`交换内容。
- `shrink_to_fit()`: 尝试减小`vector`的容量以匹配它的大小。
6. **分配器**
- `allocator_type get_allocator()`: 返回`vector`使用的分配器。
7. **迭代器**
- `begin()` 和 `end()`: 返回指向`vector`开始和结束位置的迭代器。
- `cbegin()` 和 `cend()`: 返回指向`vector`开始和结束位置的常量迭代器。
- `rbegin()` 和 `rend()`: 返回指向`vector`反向开始和结束位置的逆向迭代器。
- `crbegin()` 和 `crend()`: 返回指向`vector`反向开始和结束位置的常量逆向迭代器。
以上就是`std::vector`的一些基本功能概述。每个函数都有其特定的用途,在不同的场景下选择合适的函数可以有效地管理和操作数据.
相关文章:

自定义string类
#include <iostream> #include <string> int main() { std::string str "Hello, World!"; // 使用 c_str() 将 std::string 转换为 C 风格字符串,并传递给 printf printf("The string is: %s\n", str.c_str()); // 尝试修改…...

Python | Leetcode Python题解之第387题字符串中的第一个唯一字符
题目: 题解: class Solution:def firstUniqChar(self, s: str) -> int:position dict()q collections.deque()n len(s)for i, ch in enumerate(s):if ch not in position:position[ch] iq.append((s[i], i))else:position[ch] -1while q and po…...
RocketMQ 消费时序列化报错问题分析及解决
问题背景 在2024年3月7日,系统消费 RocketMQ 消息时出现了序列化报错,错误信息显示为: java.io.InvalidClassException: com.xxx.xxx.bean.mg.GoodsChangeLogMessage; local class incompatible: stream classdesc serialVersionUID... 这是…...

全能与专精:探索未来AI模型的发展趋势与市场潜力
文章目录 每日一句正能量前言AI模型的全面评估和比较AI模型的专精化和可扩展性AI模型的合理使用和道德规范后记 每日一句正能量 一个人,如果没有经受过投资失败的痛楚,又怎么会看到绝望之后的海阔天空。很多时候,经历了人生中最艰难的事&…...
Python深度学习:【开源数据集系列】ImageNet数据集
ImageNet 是一个大规模的视觉数据集,是计算机视觉领域最重要的基准数据集之一。该数据集由普林斯顿大学和斯坦福大学的研究人员发起,于 2009 年推出。ImageNet 是用于物体分类、目标检测、图像分割、姿势估计等多种任务的通用数据集,尤其在深度学习和计算机视觉的突破性研究…...

微信小程序手写签名
微信小程序手写签名组件 该组件基于signature_pad封装,signature_pad本身是web端的插件,此处将插件代码修改为小程序端可用。 signature_pad.js /*!* Signature Pad v5.0.3 | https://github.com/szimek/signature_pad* (c) 2024 Szymon Nowak | Releas…...

Javascript 使用中点查找矩形的角(Find Corners of Rectangle using mid points)
考虑一个矩形 ABCD,我们给出了边 AD 和 BC 中点(分别为 p 和 q)的坐标以及它们的长度 L(AD BC L)。现在给定参数,我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子: 输入:p (1,…...

【困难】 猿人学web第一届 第18题 jsvmp 洞察先机
文章目录 数据接口分析还原加密参数插桩调试分析日志插桩补充 python 代码 数据接口分析 数据接口 https://match.yuanrenxue.cn/match/18data 请求参数 {page: 页码, t: 时间戳, v: 加密值} 请求第一页不需要携带 t, v 参数 cookie 只需要携带 sessionid 只要 还原加密字段…...

IDEA Maven 源修改为国内阿里云镜像的正确方式
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storm…...

OpenCV 旋转矩形边界
边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用的函数是**cv.minAreaRect**()。 import cv2 import numpy as npimgcv2.imread(rD:\PythonProject\thunder.jpg) img1cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) print(img.dtype) ret,threshcv2.threshold(img1,1…...

人车防撞系统安全生产方案
根据《市场监管总局关于2021~2023年全国特种设备安全状况的通告》数据显示:2023年:全国共发生特种设备事故和相关事故71起,其中死亡69人。包含叉车在内的场(厂)内专用机动车辆事故29起、死亡28人,占事故总数的40.85%、死亡人数的4…...

开放式耳机哪个牌子好?长文传授6招秘籍,彻底远离坑货!
大家好,作为一位专注于评测各类数码产品的博主,今天我特别推荐开放式耳机作为我们日常的首选。这种耳机以其独特的设计,避免了传统耳机长时间佩戴可能带来的不适和感染风险。开放式耳机佩戴简便且稳固,尤其适合热爱跑步和运动的…...
vue2和vue3双向绑定的原理
Vue.js 的双向绑定是 Vue 框架的核心特性之一,它允许数据和视图之间保持同步。虽然 Vue 2 和 Vue 3 都实现了双向绑定,但它们在实现细节上有所不同。 Vue 2 双向绑定的原理 在 Vue 2 中,双向绑定主要依赖于 Object.defineProperty 和观察者…...

别为大文件烦恼!mp4文件太大怎么变小?3个管用方法
你是否曾经遇到过mp4视频文件过大的困扰?每当想要分享或存储mp4文件时,巨大的文件就成了阻碍。明明感觉感觉没占用多少空间,但是设备却常常出现空间过满警告。 没多少空间的设备真是让人大为恼火,没人想多花一份钱买设备。那么只…...

cocotb的接收和发送逻辑,还是没有弄明白
发送有两种方式 1、定义这样的发 通过前缀连接DUT里面的信号 发送的时候,通过.去访问就可以 2、如果是AXI总线,可以直接调用cocotb的库文件 AXIS总线可以包含以下的信号 通过这个类,可以产生一个AXIS的一帧数据 类的实现大概如下 然后也…...

XXL-JOB调度中心与执行器
XXL-JOB是一个轻量级的分布式任务调度平台,主要由调度中心和执行器两部分组成。下面详细讲解调度中心与执行器的功能和作用。 调度中心 调度中心是XXL-JOB的核心组件,负责任务的调度管理。其主要功能包括: 任务管理:调度中心提供…...
Notepad++ 8.6.9 (代码编辑) 绿色版
Notepad编辑器是一款非常流行的编辑软件,对于技术白菜来说,有这么个神器真是方便多了,Notepad界面简洁明了,而且可以定制界面,又支持多国语言,是站长们的得力助手。免费、开源、绿色,对中文支持…...

【例003】利用MATLAB绘制有趣平面图形
题目: 用 ezplot 画出由方程 sin ( x 2 m y 2 1000 ) cos ( x y ) \sin(x^2\frac{my^2}{1000})\cos(xy) sin(x21000my2)cos(xy) 确定隐函数的图形。 求解: 我们分别取m为100,1000,10000不同的值,绘制不同情况下的图…...

Ignis公链探索生态建设新范式:产业区块链与GameFi双轨驱动
Ignis公链凭借其独特的技术架构,选择了产业区块链与GameFi这两个赛道作为生态建设的双轮驱动,逐步形成了一个多元化的Web3生态系统。 一、产业区块链的革新:Vessel Chain的成功案例 在产业区块链领域,Ignis公链通过推出Vessel Ch…...
河南测绘资质申请中的技术装备需求
技术装备要求概览 购置与测绘业务相适应的技术设备:需要购置与测绘业务相适应的技术设备,如全站仪、水准仪、GNSS接收机等。 需要建立技术装备清单,并确保这些设备处于良好的工作状态。 技术装备的精度要求:GNSS接收机、全站仪…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...