*是C风格的字符串 std::string是C++风格的字符串,它封装了const char* 初始化std::string对象: std::string name = "jack";//直接赋值...//返回值不是对象本身,而是指向对象的指针 ... delete namep; 把std::string 转化为const char*类型 const char* cstring = name.c_str...std::string& string, const std::string& fontName, float fontSize, const Size& dimensions...std::string& string 要显示的字符串 const std::string& fontName 字体的名字 float fontSize 字体的大小 const Size&...,而不是编译系统,相当于原来的LabelTTF static Label* createWithTTF(conststd::string & text, const std::string & fontFile
// c++17 for(const auto& [key, value]: map){ // ... } *: 严格来说,结构化绑定的结果并不是变量,c++标准称之为名字/别名,这也导致它们不允许被...比如我想实现一个函数将不同类型的输入转化为字符串,在 c++17 之前需要写三个函数去实现,而 c++17 只需要一个函数。...c++17 之前,我们处理只读字符串往往使用const std::string&,std::string有两点性能优势: 兼容两种字符串类型,减少类型转换和内存分配。...如果传入的是明文字符串const char*, const std::string&需要进行一次内存分配,将字符串拷贝到堆上,而std::string_view则可以避免。...// pre c++17 ReturnType* func(const std::string& in) { ReturnType* ret = new ReturnType; if (
SDS(simple dynamic string),简单动态字符串。是由Redis自己创建的一种表示字符串的抽象类型。C字符串是不可被修改的。但是SDS是动态可以被修改的。...C字符串的函数。...---- 【为什么Redis使用SDS而不是C字符串】 首先,C字符串没有记录字符长度,每次都需要遍历,所以复杂度为O(n)。...如下所示: 第三:C字符串存在内存重分配的性能损耗;SDS采用空间预分配和惰性空间释放来减少性能损耗。 第四:C字符串只能保存文本数据,并且字符串里面不能包含空字符,否则就会被误认为是字符串结尾。...SDS则采用二进制来保存数据,并且它使用len属性来判断字符串末尾而不是空字符。所以,它不仅可以保存文本数据,也可以保存任意格式的二进制数据,如:图片、音频、视频、压缩文件这样的二进制数据。
; // 在str后追加一个字符串"it" cout << str2 << endl; cout c_str() C语言的方式打印字符串...//这是传的不是别名会有拷贝构造,拷贝的不就是我想要的吗所以直接交换 String& operator=(String s) { swap(_str, s....string& s1, const string& s2) { return strcmp(s1.c_str(), s2.c_str()) < 0; } bool operator <= (...(s1 < s2); } bool operator == (const string& s1, const string& s2) { return strcmp(s1.c_str(), s2...引用的是临时对象去调用构造 cout << ("hello world" < s2) << endl; cout << (s1 == "hello world") << endl; //两个指针的比较不是字符串的比较
//谓词:比较函数,用来按长度排列字符串 bool shorter(const string& s1,const string& s2) { return s1.size()<s2.size(); }...auto关键字实际会将 Lambda 表达式转换成一种类似于std::function的内部类型(但并不是std::function类型,虽然与std::function“兼容”)。...shorter()比较函数的功能: auto f=[](cosnt string& a,const string& b) { return a.size()<b.size(); } //将Lambda...当该类被构造时,周围的变量就传递给构造函数并以成员变量保存起来,看起来跟函数对象(仿函数)很相似,但是C++11标准建议使用Lambda表达式,而不是函数对象,Lambda表达式更加轻量高效,易于使用和理解...而事实上,lambda类型并不是简单的函数指针类型或者自定义类型,lambda函数是一个闭包(closure)的类,C++11标准规定,closure类型是特有的、匿名且非联合体的class类型。
常用函数 构造函数 string(): 默认构造函数,创建一个空字符串。 string(const string& str): 拷贝构造函数,用另一个字符串初始化。...修改函数 assign(const string& str): 用另一个字符串替换内容。...assign(const string& str, size_type pos, size_type n): 用另一个字符串的子串替换内容。...assign(size_type n, char c): 用n个c字符替换内容。 append(const string& str): 在字符串末尾添加另一个字符串。...insert(size_type pos, const string& str): 在位置pos插入另一个字符串。
small amounts of data between threads by value, rather than by reference or pointer CP.31:在线程之间以传值方式传递少量数据...,而不是传递引用或指针 Reason(原因) Copying a small amount of data is cheaper to copy and access than to share it...Example(示例) string modify1(string); void modify2(string&); void fct(string& s) { auto res = async...另一方面,(多任务环境下,译者注)modify1的实现和单线程代码完全相同,而modify2会需要某种形式的互斥锁以避免数据竞争。...如果是长string(例如1,000,000个字符),拷贝两次可能不是一个好主意。
, 如果 char 在指定的平台上 被当作负数处理 , 直接传递给 tolower 可能会导致未定义的行为 ; 代码示例 : #include "iostream" using namespace std...string& str1, const string& str2) 接收 2 个 字符串 参数 , 注意 : 比较的前提是 不能修改实参的值 , 这里重新创建 2 个字符串 , 用于 将 字符串转为..., const string& str2) const { // 比较的前提是不能修改实参的值 // 这里重新创建 2 个字符串 , 用于进行比较 // 创建字符串 string s1...string& str1, const string& str2) const { // 比较的前提是不能修改实参的值 // 这里重新创建 2 个字符串 , 用于进行比较 // 创建字符串.../summary> class Compare { public: bool operator()(const string& str1, const string& str2) const {
:string&’ from a temporary of type ‘std::string’的错误。...出错的代码如下: void print(string& str) { cout<<str<<endl; } //如此调用会报上面描述的错误 print("hello world"); 出错的原因是编译器根据字符串...当这个临时对象传递给非const的string&引用类型时,因为非const引用绑定对象时,要求该对象也是非const对象。而在这时,因为string类型的临时对象是const对象,所以就出现错误。...C++中倡导的一个C++的编程原则,即尽可能的使用const。...那哪些临时对象是const对象,哪些临时对象不是const对象呢?
//谓词:比较函数,用来按长度排列字符串 bool shorter(const string& s1,const string& s2) { return s1.size()<s2.size(); }...auto关键字实际会将 Lambda 表达式转换成一种类似于std::function的内部类型(但并不是std::function类型,虽然与std::function“兼容”)。...传入排序算法sort中 sort(words.begin(),word2.end(),[](cosnt string& a,const string& b){ return a.size()传递给构造函数并以成员变量保存起来,看起来跟函数对象(仿函数)很相似,但是 C++11 标准建议使用 Lambda 表达式,而不是函数对象,Lambda 表达式更加轻量高效,...而事实上,lambda类型并不是简单的函数指针类型或者自定义类型,lambda函数是一个闭包(closure)的类,C++11标准规定,closure类型是特有的、匿名且非联合体的class类型。
C++函数指针和std::function对象 这篇博文中通过实现对String字符串大小写转换为列来说明C++中函数指针和std::function对象的使用。...我们在博文《C++实现一个简单的String类》中的自定义的String类为基础,再添加两个成员函数用于将字符串全部转为大写(toUpperCase)和全部转为小写(toLowerCase)。...既然两个函数有相同的部分,我们可以将相同的部分抽取出来,抽取出来的这部分负责对字符串进行遍历,然后将对于单个字符转换的函数作为参数传递到该用于字符串遍历的函数中。...::ostream& output, const String& str); friend std::istream& operator>>(std::istream& input, String...& output, const String& str); friend std::istream& operator>>(std::istream& input, String& str);
持续关注 正文开始 标准库中的string类 C语言中的字符串: C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的...注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个 类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。...(const string& s); string& operator=(const string& s); ~string(); const char* c_str() const;...=(const string& s)const; void clear(); //迭代器可理解像指针但不是指针 typedef char* iterator; typedef const...总结 本文介绍了C++标准库中的string类,包括其定义、使用方法、常用接口以及与C语言字符串的比较。
在C中指针是完成这一目的的标准数据结构,而C++引入了安全性更高的引用类型。所以在C++中若传递的数据仅仅只读,const string&成了C++的天然的方式。...实际上我们本意并不是要改变原字符串,为什么不在原字符串基础上返回呢? 在C++17中引入了string_view,能很好的解决以上两个问题。...但并不是所有的“翻译”过程都是这样的,比如: void lines(std::vectorstd::string> &lines, const std::string& str) { std:...只不过是相比const string&,string_view少了拷贝的损耗。实际上我们完全可以用[const] char*接收所有的字符串,但这个类型太底层了,不便使用。...所以,推荐的使用方式:仅仅作为函数参数,因为如果该参数仅仅在函数体内使用而不传递出去,这样使用是安全的。
举个例子,auto& 告诉编译器,num 是一个引用 add容器中的实际元素,而不是一个副本。因此,如果对 num 的修改会直接 add中的元素。...string类的常用接口说明和使用在C++中,std::string 类是标准库的一部分,它提供了一个方便的接口来处理字符串。...find(const char* str, size_t pos = 0);//指定位置插入字符string& insert(size_t pos, char c);//指定位置插入字符串string...);//调整字符串大小void resize(size_t n, char c = '\0');//判断字符串是不是空bool empty()const;//字符串交换void swap(string&...string& lhs, const string& rhs){return strcmp(lhs.c_str(), rhs.c_str()) (const string
为什么要学习string类 C语言中的字符串 C 语言中,字符串是以 '\0' 结尾的一些字符的集合,为了操作方便, C 标准库中提供了一些 str 系列的库函数, 但是这些库函数与字符串是分离开的...注意,这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( 如 UTF-8) 的序列,这个类的所有成员( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符...+= ( 重点 ) : 在字符串后追加字符串 str c_str ( 重点 ) : 返回 C 格式字符串 find + npos ( 重点 ) : 从字符串 pos 位置开始往后找字符...);//追加字符串 string& operator+=(char ch); string& operator+=(const char* str); size_t find(const..._capacity; } const char* string::c_str() const//返回字符串 { return _str; } size_t string :
注意,这个类独立于所使用的编码来处理字节 : 如果用来处理多字节或变长字符 ( 如 UTF-8) 的序列,这个类的所有成员( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符...如果用std::swap交换两个string对象,将会发生1次构造和2次赋值,也就是三次深拷贝; 而string内部的swap仅仅只交换成员,代价较小。...//交换 void swap(string& s) { std::swap(_str, s._str); std::swap(_size, s....bool operator==(const string& a ,const string& b) { int ret = strcmp(a.c_str(), b.c_str()); return...ret == 0; } bool operatorconst string& a, const string& b) { int ret = strcmp(a.c_str(), b.c_str
字符串的标准 计算机是二进制,但是如果让我们去理解一堆0和1组成的是什么意思很难理解,所以就有了编码(计算机存值——文字符号,对应关系): 这些符号就可以组成很多东西了,比如数值,单词等等。...先来看赋值: string& operator= (const string& str);赋值string类的对象 string& operator= (const char* s);赋值字符串...operator+=在后面追加一个字符串或字符还有对象 void push_back (char c); string& append (const char* s); string& operator...+= (const string& str); string& operator+= (const char* s); string& operator+= (char c); #include...返回C语言的字符串 string& insert (size_t pos, const string& str); string& insert (size_t pos, const char* s
不要滥用:运算符重载虽然强大,但也不是万能的。不要为了重载而重载,只有当它确实能够提高代码的可读性和易用性时才考虑使用。...以下是C++运算符重载的基本语法: 作为成员函数重载 当运算符重载为成员函数时,其左侧操作数(即运算符左侧的对象)隐式地通过this指针传递。...不过,这通常不是处理字符串字面量的直接方法。...std::endl; // 输出: hello_again return 0; } 请注意,上面的STR_SUFFIX宏示例实际上并不是真正的后缀重载,因为C++不允许在字符串字面量后直接附加用户定义的后缀...类型转换:提供了到std::string和char*的隐式类型转换,方便与标准库和C风格字符串的交互。 数值转换:提供了将字符串转换为整数和浮点数的方法。
s中查找第一个长度大于等于字符串sz的元素 #include #include #include using namespace std;...与参数不同,被捕获的变量的值实在lambda创建时拷贝,而不是调用时拷贝 举例: #include using namespace std; void test() { size_t...' ') { //os为隐式捕获,引用捕获方式 //c显示捕获,值捕获方式 for_each(words.begin(), words.end(), [&, c](const string...(), [=,&os](const string& s) {os c; }); } int main() {...是因为由lambda产生的类中的函数调用的运算符是一个const成员函数。如果lambda被声明为可变的,则调用运算符就不是const的了。
现代C++之容器 本节将深入学习现代C++实战30讲中的第4节与第5节容器所提到的内容。正文中的一些文字直接引用自上面。...) string 支持从 istream 安全地读入字符串(使用 getline) string 支持给期待 const char* 的接口传递字符串内容(使用 c_str) string 支持到数字的互转...不建议在接口中使用const string&,除非确知调用者已经持有 string:如果函数里不对字符串做复杂处理的话,使用 const char* 可以避免在调用者只有 C 字符串时编译器自动构造 string...反过来,如果实现较为复杂、希望使用 string 的成员函数的话,那就应该考虑下面的策略: 如果不修改字符串的内容,使用 const string& 或 C++17 的 string_view 作为参数类型...4.queue与stack (1)为什么 stack(或 queue)的 pop 函数返回类型为 void,而不是直接返回容器的 top(或 front)成员?
领取专属 10元无门槛券
手把手带您无忧上云