C++相关闲碎记录(15)

1、string字符串

#include <iostream>
#include <string>
using namespace std;int main (int argc, char** argv)
{const string delims(" \t,.;");string line;// for every line read successfullywhile (getline(cin,line)) {string::size_type begIdx, endIdx;// search beginning of the first wordbegIdx = line.find_first_not_of(delims);// while beginning of a word foundwhile (begIdx != string::npos) {// search end of the actual wordendIdx = line.find_first_of (delims, begIdx);if (endIdx == string::npos) {// end of word is end of lineendIdx = line.length();}// print characters in reverse orderfor (int i=endIdx-1; i>=static_cast<int>(begIdx); --i) {cout << line[i];}cout << ' ';// search beginning of the next wordbegIdx = line.find_first_not_of (delims, endIdx);}cout << endl;}
}
输入:ajsdk12345e.asfa        \jkawefa
输出:e54321kdsja afsa afewakj\ 
(1)string各项操作

 (2)构造函数和析构函数

 data() 和 c_str()以字符数组的形式返回string内容,并且在该数组位置[size()]上有一个'\0'结束字符。copy()将string内容复制到调用者提供的字符数组中,其末尾不添加'\0'字符,注意,data()和c_str()返回的字符数组由该string拥有,也就是说,调用者不可以改动它或者释放其内存。

例如:

std::string s("12345");
atoi(s.c_str())           
f(s.data, s.length())char buffer[100];
s.copy(buffer, 100);    //copy at most 100 characters os s into buffer
s.copy(buffer, 200, 2); //copy at most 100 characters of s into buffer//starting with the third character of s

一般而言,整个程序你应该坚持使用string,直到你必须将其内容转化为char*时,注意c_str()和data()的返回值的有效期在下一次调用non-const 成员函数时即告终止。

std::string s;
...
foo(s.c_str());  //s.c_str() is valid during the whole statementconst char* p;
p = s.c_str();   //p refers to the contents of s as a C-string
foo(p);          //OK (p is still valid)
s += "ext";      //invalidates p
foo(p);          //ERROR: argument p is not valid
(3)赋值操作
const std::string aString("othello");
std::string s;
s = aString;
s = "two\nlines";
a = ' ';
s.assign(aString);
s.assign(aString, 1, 3);
s.assign(aString, 2, std::string::npos);
s.assign("two\nlines");
s.assign("nico", 5);
s.assign(5, 'x');
(4)安插和移除字符
const std::string aString("othello");
std::string s;
s += aString;
s += "two\nlines";
s += '\n';
s += {'o', 'k'};
s.append(aString);
s.append(aString, 1, 3);   //append "the"
s.append(aString, 2, std::string::npos);    // append "hello"
s.append("two\nlines");
s.append("nico", 5);         //append character array 'n' 'i' 'c' '0' '\0'
s.append(5, 'x');            //append five characters 'x' 'x' 'x' 'x' 'x'
s.push_back('\n');       s.insert(1, aString);
//注意,成员函数insert()不接受索引+单字符的实参组合,必须传入一个string或者加上一个额外数字
s.insert(0, ' ');  //ERROR
s.insert(0, " ");  //OK
//你也可以这样尝试
s.insert(0, 1,' ');   // ERROR : ambiguous
// 由于insert()具有以下重载形式,上一行会导致令人厌烦的歧义
insert(size_type idx, size_type num, charT c);  //position is index
insert(iterator pos, size_type num, charT c);   //position is iterator
string的size_type通常被定义为unsigned,string的iterator通常被定义为char*。
于是第一实参0有两种转换可能,不分优劣,为了获得正确的操作,必须使用如下:
s.insert((std::string::size_tpye)0, 1, ' ');  //OK
std::string s = "i18n";                 //s:i18n
s.replace(1, 2, "nternationalizatio");  //s:internationalization
s.erase(13);                            //s:international
s.erase(7, 5);                          //s:internal
s.pop_back();                           //s:interna(since C++11)
s.replace(0, 2, "ex");                  //s:externa
(5)子字符串和字符串拼接
std::string s("interchangeability");
s.substr()                  //returns a copy of s
s.substr(11)                //returns string("ability")
s.substr(5, 6);             //returns string("change")
s.substr(s.find('c'));      //returns string("changeability")
(6)getline()

读取一行字符,包括前导空白字符,遇到换行或者end-of-file,分行符会被读取出来,但是不会添加到结果上,默认分行符是换行符号,也可以自定义任意符号作为分行符。

while(std::getline(std::cin,s)) {}
while(std::getline(std::cin, s, ':')){}

 如果自定义了分行符,则换行符就被当做普通字符。

(7)搜索查找

std::string s("Hi Bill, I'm ill, so please pay the bill");
s.find("il");                    //returns 4
s.find("il", 10);                //returns 13
s.rfind("il");                   //returns 37
s.find_first_of("il");           //returns 1
s.find_last_of("il");            //returns 39
s.find_first_not_of("il");       //returns 0
s.find_last_not_of("il");        //returns 36
s.find("hi");                    //returns npos
(8)npos的意义

如果查找失败,会返回string::npos,使用string的npos值及其类型时要格外小心,若要检查函数返回值,一定要使用类型string::size_type,不能使用int或unsigned作为返回值类型,否则返回值与string::npos之间的比较可能无法正确执行,这是因为npos被设置为-1。

事实上(unsigned long)-1与(unsigned short)-1不同,因此对于下列表达式:

idx == std::string::npos,如果idx的值为-1,由于idx和string::npos类型不同,比较结果可能会是false。

(9)数值转换

自C++11起,C++标准库提供了一些便捷函数,用来将string转换为数值或者反向转换,但是只适用于类型string或者wstring类型,不适用于u16string和u32string。

#include <string>
#include <iostream>
#include <limits>
#include <exception>int main()
{try {// convert to numeric typestd::cout << std::stoi ("  77") << std::endl;std::cout << std::stod ("  77.7") << std::endl;std::cout << std::stoi ("-0x77") << std::endl;// use index of characters not processedstd::size_t idx;std::cout << std::stoi ("  42 is the truth", &idx) << std::endl;std::cout << " idx of first unprocessed char: " << idx << std::endl;// use bases 16 and 8std::cout << std::stoi ("  42", nullptr, 16) << std::endl;std::cout << std::stol ("789", &idx, 8) << std::endl;std::cout << " idx of first unprocessed char: " << idx << std::endl;// convert numeric value to stringlong long ll = std::numeric_limits<long long>::max();std::string s = std::to_string(ll);  // converts maximum long long to stringstd::cout << s << std::endl;// try to convert backstd::cout << std::stoi(s) << std::endl;  // throws out_of_range}catch (const std::exception& e) {std::cout << e.what() << std::endl;}
}
输出:
77
77.7
0
42idx of first unprocessed char: 4
66
7idx of first unprocessed char: 1
9223372036854775807
stoi

 std::stoi("-0x77")只会解析-0,std::stol("789", &idx, 8)只解析7,因为8在8进制中是一个无效字符。

(10)string iterator使用实例

#include <string>
#include <iostream>
#include <algorithm>
#include <cctype>
#include <regex>
using namespace std;int main()
{// create a stringstring s("The zip code of Braunschweig in Germany is 38100");cout << "original: " << s << endl;// lowercase all characterstransform (s.cbegin(), s.cend(),  // sources.begin(),             // destination[] (char c) {          // operationreturn tolower(c);});cout << "lowered:  " << s << endl;// uppercase all characterstransform (s.cbegin(), s.cend(),  // sources.begin(),             // destination[] (char c) {          // operationreturn toupper(c);});cout << "uppered:  " << s << endl;// search case-insensitive for Germanystring g("Germany");string::const_iterator pos;pos = search (s.cbegin(),s.cend(),     // source string in which to searchg.cbegin(),g.cend(),     // substring to search[] (char c1, char c2) {  // comparison criterionreturn toupper(c1) == toupper(c2);});if (pos != s.cend()) {cout << "substring \"" << g << "\" found at index "<< pos - s.cbegin() << endl;}
}
输出:
original: The zip code of Braunschweig in Germany is 38100
lowered:  the zip code of braunschweig in germany is 38100
uppered:  THE ZIP CODE OF BRAUNSCHWEIG IN GERMANY IS 38100
substring "Germany" found at index 32
(11)为string打造trait class,允许以大小写无关的方式操作字符
#ifndef ICSTRING_HPP
#define ICSTRING_HPP#include <string>
#include <iostream>
#include <cctype>// replace functions of the standard char_traits<char>
// so that strings behave in a case-insensitive way
struct ignorecase_traits : public std::char_traits<char> {// return whether c1 and c2 are equalstatic bool eq(const char& c1, const char& c2) {return std::toupper(c1)==std::toupper(c2);}// return whether c1 is less than c2static bool lt(const char& c1, const char& c2) {return std::toupper(c1)<std::toupper(c2);}// compare up to n characters of s1 and s2static int compare(const char* s1, const char* s2,std::size_t n) {for (std::size_t i=0; i<n; ++i) {if (!eq(s1[i],s2[i])) {return lt(s1[i],s2[i])?-1:1;}}return 0;}// search c in sstatic const char* find(const char* s, std::size_t n,const char& c) {for (std::size_t i=0; i<n; ++i) {if (eq(s[i],c)) {return &(s[i]);}}return 0;}
};// define a special type for such strings
typedef std::basic_string<char,ignorecase_traits> icstring;// define an output operator
// because the traits type is different from that for std::ostream
inline
std::ostream& operator << (std::ostream& strm, const icstring& s)
{// simply convert the icstring into a normal stringreturn strm << std::string(s.data(),s.length());
}#endif    // ICSTRING_HPP
#include "icstring.hpp"int main()
{using std::cout;using std::endl;icstring s1("hallo");icstring s2("otto");icstring s3("hALLo");cout << std::boolalpha;cout << s1 << " == " << s2 << " : " << (s1==s2) << endl;cout << s1 << " == " << s3 << " : " << (s1==s3) << endl;icstring::size_type idx = s1.find("All");if (idx != icstring::npos) {cout << "index of \"All\" in \"" << s1 << "\": "<< idx << endl;}else {cout << "\"All\" not found in \"" << s1 << endl;}
}
输出:
hallo == otto : false
hallo == hALLo : true
index of "All" in "hallo": 1

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

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

相关文章

ADUM1200ARZ数字隔离器:重新定义技术标准

ADUM1200ARZ数字隔离器成为技术进步领域的关键组件。其创新设计和多方面功能重新定义了数字隔离技术的格局&#xff0c;提供了满足不同工业需求的众多功能。让我们通过本文直观的了解ADUM1200ARZ的功能与技术标准。 窄体且符合ROHS&#xff1a;设定新基准 该数字隔离器采用窄体…

持续集成交付CICD:Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布

目录 一、实验 1.蓝绿发布准备 2.Jenkins使用GitLab共享库实现基于Ansible的CD流水线部署前端应用的蓝绿发布 二、问题 1.手动构建Jenkins前端项目CI流水线报错 2.如何优化手动构建流水线选项参数 一、实验 1.蓝绿发布准备 &#xff08;1&#xff09;环境 表1 蓝绿发布…

用EnumSet代替位域

在Java中&#xff0c;可以使用EnumSet来代替位域&#xff0c;以提高代码的可读性和类型安全性。下面是一个简单的例子&#xff0c;演示如何使用EnumSet来管理一组枚举值&#xff1a; import java.util.EnumSet;// 定义一个枚举类型表示权限 enum Permission {READ, WRITE, EXE…

NCNN 源码学习【三】:数据处理

一、Topic&#xff1a;数据处理 这次我们来一段NCNN应用代码中&#xff0c;除了推理外最重要的一部分代码&#xff0c;数据处理&#xff1a; ncnn::Mat in ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, 227, 227);const float mean_v…

DDOS 攻击是什么?有哪些常见的DDOS攻击?

DDOS简介 DDOS又称为分布式拒绝服务&#xff0c;全称是Distributed Denial of Service。DDOS本是利用合理的请求造成资源过载&#xff0c;导致服务不可用&#xff0c;从而造成服务器拒绝正常流量服务。就如酒店里的房间是有固定的数量的&#xff0c;比如一个酒店有50个房间&am…

C# OpenVINO 直接读取百度模型实现图片旋转角度检测

目录 效果 模型信息 代码 下载 C# OpenVINO 直接读取百度模型实现图片旋转角度检测 效果 模型信息 Inputs ------------------------- name&#xff1a;x tensor&#xff1a;F32[?, 3, 224, 224] --------------------------------------------------------------- Ou…

RV32/64 特权架构

machine mode: 运行最可信的代码;supervisor mode:为 Linux&#xff0c;FreeBSD 和 Windows 等操作系统提供支持;user mode:权限最低&#xff0c;应用程序的代码在此模式下运行&#xff1b; 这两种新模式都比user mode有着更高的权限&#xff0c;有更多权限的模式通常可以使用…

算法:二叉树的遍历

一、31种遍历方法 (1)先序法&#xff08;又称先根法&#xff09; 先序遍历&#xff1a;根&#xff0c;左子树&#xff0c;右子树 遍历的结果&#xff1a;A&#xff0c;B&#xff0c;C 遍历的足迹&#xff1a;沿途经过各结点的“左部” (2)中序法&#xff08;又称中根法&#…

【Spark精讲】Spark内存管理

目录 前言 Java内存管理 Java运行时数据区 Java堆 新生代与老年代 永久代 元空间 垃圾回收机制 JVM GC的类型和策略 Minor GC Major GC 分代GC Full GC Minor GC 和 Full GC区别 Executor内存管理 内存类型 堆内内存 堆外内存 内存管理模式 静态内存管理 …

LV.13 D4 uboot使用 学习笔记

一、uboot环境变量命令 1.1 uboot模式 自启动模式 uboot 启动后若没有用户介入&#xff0c;倒计时结束后会自动执行自启动环境变量 (bootcmd) 中设置的命令&#xff08;一般作加载和启动内核&#xff09; 交互模式 倒计时结束之前按下任意按键 uboot 会进…

牛客后端开发面试题1

滴滴2022 1.redis过期策略 定时删除&#xff0c;定期删除&#xff0c;惰性删除 定时删除&#xff1a;设定一个过期时间&#xff0c;时间到了就把它删掉&#xff0c;对cpu不太友好&#xff0c;但是对内存友好 定期删除&#xff1a;每隔一个周期删除一次&#xff0c;对cpu和内存…

软件开发模型学习整理——瀑布模型

一 前言 从参加工作至今也完整的跟随过一整个项目的流程了&#xff0c;从中也接触到了像瀑布模型&#xff0c;迭代模型&#xff0c;快速开发模型等。介于此&#xff0c;基于自己浅薄的知识对瀑布模型进行整理学习以及归纳。 二 瀑布模型简介 2.1 瀑布模型的定义和特点 定义&…

这应该是最全的大模型训练与微调关键技术梳理

作为算法工程师的你是否对如何应用大型语言模型构建医学问答系统充满好奇&#xff1f;是否希望深入探索LLaMA、ChatGLM等模型的微调技术&#xff0c;进一步优化参数和使用不同微调方式&#xff1f;现在我带大家领略大模型训练与微调进阶之路&#xff0c;拓展您的技术边界&#…

动态规划习题

动态规划的核心思想是利用子问题的解来构建整个问题的解。为此&#xff0c;我们通常使用一个表格或数组来存储子问题的解&#xff0c;以便在需要时进行查找和使用。 1.最大字段和 #include <iostream> using namespace std; #define M 200000int main() {int n, a[M], d…

死锁 + 条件变量 + 生产消费者模型

文章目录 死锁如何解决死锁问题呢&#xff1f;避免死锁 同步概念1.快速提出解决方案 --- 条件变量原理接口2. CP问题 --- 理论3. 快速实现CP 死锁 现象 &#xff1a; 代码不会继续往后推进了 问题 一把锁有没有可能产生死锁呢&#xff1f; 有可能 线程第一次申请锁成功&…

【node】使用 sdk 完成短信发送

实现效果 过程 流程比较复杂&#xff0c;加上需要实名认证&#xff0c;建议开发的时候先提前去认证号账号&#xff0c;然后申请模版也需要等认证。 源码 我看了新版的sdk用的代码有点长&#xff0c;感觉没必要&#xff0c;这边使用最简单的旧版的sdk。 https://github.com/…

智能优化算法应用:基于秃鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于秃鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于秃鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.秃鹰算法4.实验参数设定5.算法结果6.参考文献7.MA…

基于ssm电子资源管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 环境&#xff1a; jdk8 tomcat8.5 基于ssm电子资源管理系统源码和论文758 摘要 随着互联网技术的高速发展&#xff0c;人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门…

jmeter,http cookie管理器

Http Cookie管理器自动实现Cookie关联的原理&#xff1a; (默认:作用域在同级别的组件) 一:当Jmeter第1次请求服务器的时候,如果说服务器有通过响应头的Set-Cookie有返回Cookie,那么Http Cookie管理器就会自动的保存这些Cookie的值。 二&#xff1a;当Jmeter第2-N次请求服务器的…

Redis 过期删除策略、内存回收策略、单线程理解

不知从何开始Redis的内存淘汰策略也开始被人问及&#xff0c;卷&#xff01;真的是太卷了。难不成要我们去阅读Redis源码吗&#xff0c;其实问题的答案&#xff0c;在Redis中的配置文件中全有&#xff0c;不需要你阅读源码、这个东西就是个老八股&#xff0c;估计问这个东西是想…