【与C++的邂逅】--- string容器使用

【与C++的邂逅】--- string容器使用

 Welcome to 9ilk's Code World

       

(๑•́ ₃ •̀๑) 个人主页:        9ilk

(๑•́ ₃ •̀๑) 文章专栏:     与C++的邂逅   


本篇博客我们将来了解string容器本身以及接口的使用。

string是串,本质是一个字符数组,可以对其进行增删查改。

🏠 string构造

//常用 string s1; string s2("hello world"); string s3(s2); //不常用 string s4(s2,3,5); // string (const string& str, size_t pos, size_t len = npos) string s5(s2,3); string s6(s2,3,30); string s7("hello world",5) //string (const char* s, size_t n) string s8(10,'x'); //string (size_t n, char c);

对于string的构造,我们常用的是它的无参构造,拷贝构造等。注意:在库中pos通常代表位置,n代表的是个数。

  • npos

由库中文档说明,我们可以知道 :

1. npos是string里的一个const静态成员变量,类型是size_t,缺省值给的是-1(整形最大).

2. 当使用substring的这个构造时,从str的pos位置开始拷贝构造,如果要构造的长度len大于后面的长度,则有多少拷贝多少直到拷贝到结尾 .

3. 缺省参数npos是整形最大值,一定大于后面的长度,不传第三个参数默认拷贝到结尾.

string s2("hello world"); // string (const string& str, size_t pos, size_t len = npos) string s4(s2,3,5); //拷贝5个字符 string s5(s2,3); //拷贝到结尾 string s6(s2,3,30);//拷贝到结尾
  • 隐式类型转换在构造中的应用
string s1("hello world"); //隐式类型转换 string s2 = "hello world"; const string& s3 = "hello world"; //以及后面其他接口也可以使用... push_back("hello world");
说明 :

1. 对于s2是先调用常量字符串的构造生成一个临时对象,再调用拷贝构造将临时对象拷贝给s2.

2. 对于s3,它引用的是临时对象,而临时对象具有"常性",因此需要是const引用.

🏠 元素访问方式

📌 operator[ ]

 char& operator[] (size_t pos); const char& operator[] (size_t pos) const;
  • 引用返回
int main() { string s = "hello"; for (size_t i = 0; i < s.size(); i++) { cout << s.operator[](i) << " "; //显式[]+下标访问对象元素 cout << s[i] << " ";//隐式[]+下标访问对象元素 } for (size_t i = 0; i < s.size(); i++) { s[i]++; //修改访问元素内容 } return 0; }

由于string类重载了[ ]运算符,所以我们可以直接利用[ ] + 下标访问对象中的元素;同时由于是引用返回,所以我们可以通过[ ] + 下标修改对应位置的元素内容,也就是可读可写.

class string { /... private: char* _str; size_t _size; int _capacity; } char& operator[](size_t pos) { assert(i < _size); return _str[i]; }

string类一般是动态开辟内存来储存字符元素,所以实现operator[ ]一般返回的是在堆上的空间,因此我们不用担心传引用返回时返回的是一个局部对象.

传引用返回优势 : 

1. 能修改返回对象.

2. 减少拷贝.
  • string类重载的[]运算符还会执行严格的越界检查,只要下标超过size或小于0就报错.
  • opertaor[ ]有两个版本,一个是非const,返回对象可修改,是典型的可读可写;另一个是const版本,返回对象内容不可修改.
const string s2("hello"); s2[0] = 'x'; //不可修改 调用const版本的operator[] string s1("hello"); s1[0] = 'x';//调用非const版本的opeator[] 
1. const版本重载的[ ]主要是给const对象用的,毕竟const对象无法调用非const版本,这是权限的扩大.

2. 对于const和非const对象其实都能调用const版本的重载,但却重载出两个版本,这是因为各自有不同的需求(比如只有一个const版本的operator[ ],对于普通string对象就不能修改了,不符合我们的要求,如果重载了两个版本则调用更匹配的,普通对象调用普通版本,const对象调用const版本).

3.具体实践中重载[]操作符看具体需求.

📌 迭代器

迭代器目前我们可以理解为具有和指针类似行为的东西,但实际上不一定是指针.
string::iterator it = s.begin(); while (it != s.end()) { cout << *it << endl; //类似指针解引用 ++it;//类似指针++ } auto it = s.begin();
迭代器访问元素是所有容器(除stack,queue外)通用的访问方式,他们通用的将迭代器命名为iterator,头元素位置的迭代器和尾元素位置的迭代器都命名为begin和end,它们都是定义在类域里的成员函数.

注 : C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型.

for (auto ch : s) cout << ch << endl;

C++11之后我们更喜欢用范围for来访问string类元素,它底层也是利用的迭代器.

  • begin与end
对于begin返回的是开始位置,对于end返回的是最后一个字符的下一个位置,在string类中大概就是\0的位置.
  • 迭代器的版本
const string s1("hello"); string::const_iterator it1 = s1.begin(); while (it1 != s1.end()) { cout << *it1 << endl;//无法修改 } 
迭代器分为iterator(可读可写)和const_iterator(只读),对于const对象匹配的是返回const_iterator的begin().下面我们来区分const iterator , iterator 和 const_iterator.

Read more

鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生

鸿蒙APP开发从入门到精通:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生

《鸿蒙APP开发从入门到精通》第14篇:鸿蒙电商购物车全栈项目——订单管理、支付管理、AI原生 📱💳🤖 内容承接与核心价值 这是《鸿蒙APP开发从入门到精通》的第14篇——订单管理、支付管理、AI原生篇,100%承接第13篇的「用户管理、商品列表、购物车」项目架构,完成鸿蒙电商购物车全栈项目的核心业务功能实现。 学习目标: * 掌握订单管理的设计与实现; * 实现创建订单、查看订单、取消订单; * 理解支付管理的设计与实现; * 实现微信支付、支付宝支付; * 掌握AI原生的设计与实现; * 实现AI搜索、AI推荐、AI客服; * 优化订单管理、支付管理、AI原生的用户体验(响应速度、数据安全、用户反馈)。 学习重点: * 鸿蒙APP订单管理的开发流程; * 订单管理的分类与使用场景; * 支付管理的设计与实现; * AI原生的设计与实现。 一、 订单管理基础 🎯 1.1 订单管理定义 订单管理是指对应用的订单进行管理,主要包括以下方面:

By Ne0inhk

304M参数引爆AIGC效率革命:AMD Nitro-E如何重新定义图像生成范式

304M参数引爆AIGC效率革命:AMD Nitro-E如何重新定义图像生成范式 【免费下载链接】Nitro-E 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Nitro-E 导语 AMD推出仅304M参数的Nitro-E轻量级扩散模型,以1.5天训练周期和39.3样本/秒的吞吐量重新定义行业标准,推动边缘设备实时AI创作普及。 行业现状:轻量化成为AIGC部署关键 2025年全球多模态大模型市场规模预计达156.3亿元,其中图像生成技术贡献超过40%商业价值。当前主流扩散模型普遍面临"三重困境":参数量动辄数十亿导致训练成本高昂、推理速度慢难以满足实时需求、部署门槛高限制边缘应用。根据PPIO最新报告,非推理模型使用量已从3月起持续超过推理模型,反映行业对高效生成技术的迫切需求。 如上图所示,中心发光的网络球体象征AI模型核心,周围多块屏幕展示自然风景(Nitro-E生成的图像示例),地面电路板状线条体现技术架构,直观呈现了高效多模态扩散Transformer的创新设计。这一可视化清晰揭示了模型如何通过令牌压缩技术实现30

By Ne0inhk
Flutter 组件 ansi_styles 的鸿蒙化适配实战 - 驾驭极致终端交互艺术、实现 OpenHarmony 开发链路、日志系统与控制台的工业级色彩分级方案

Flutter 组件 ansi_styles 的鸿蒙化适配实战 - 驾驭极致终端交互艺术、实现 OpenHarmony 开发链路、日志系统与控制台的工业级色彩分级方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 ansi_styles 的鸿蒙化适配实战 - 驾驭极致终端交互艺术、实现 OpenHarmony 开发链路、日志系统与控制台的工业级色彩分级方案 前言 在鸿蒙(OpenHarmony)生态的底座开发、高性能服务端侧逻辑构建、或者是对命令行交互(CLI)有极其严苛要求的自动化工程流水线中。“终端日志的可视化分级与视觉重心引导维度”是衡量整个底层调试链路效能的最终质量门禁。面对包含数万行内核日志、海量网络请求报文、甚至是 0308 批次重型打包过程产生的满屏文字流。如果仅仅依靠终端中苍白的一串 White 和 Black 或者是毫无温标感的 txt 控制台。不仅会导致在定位历史回退(Regression)时让开发工程师如同在字符废墟中盲人摸象。更会因为缺乏大局观的报错优先级呈现。令技术高层在跨终端指挥调度时陷入严重的信息盲区。 我们需要一种“色彩生动、警示分明”的终端资产汇报艺术。 ansi_styles 是一套专注于无缝整合全球公认顶级

By Ne0inhk
通义万相 2.1 × 蓝耘智算:AIGC 界的「黄金搭档」如何重塑创作未来?

通义万相 2.1 × 蓝耘智算:AIGC 界的「黄金搭档」如何重塑创作未来?

我的个人主页我的专栏:人工智能领域、java-数据结构、Javase、C语言,希望能帮助到大家!!!点赞👍收藏❤ 引言 在当今数字化浪潮席卷的时代,AIGC(生成式人工智能)领域正以惊人的速度发展和变革。通义万相 2.1 和蓝耘智算,如同两颗璀璨的新星,它们的携手合作成为了 AIGC界备受瞩目的焦点。这一「黄金搭档」正凭借各自独特的优势,为内容创作带来前所未有的变革,重塑着 AIGC 领域的未来版图。如今,通义万相 2.1 与蓝耘智算的强强联合,正在为这一行业注入新动力,成为 AIGC 界的“黄金搭档”。这次合作不仅将 AI 技术带入更多创意领域,还将加速智能创作工具的普及,带来前所未有的行业变革。 接下来,让我们深入探究它们是如何发挥强大合力,引领创作新时代的。 一、技术联姻:通义万相 2.1

By Ne0inhk