C++的string类型中关于append函数、push_back函数和+=运算符的区别
部分内容翻译自 https://www.geeksforgeeks.org/stdstringappend-vs-stdstringpush_back-vs-operator-c/?ref=lbp
引言
C++的string类中,要想在字符串后附加字符,可以使用append函数、push_back函数或者是+=运算符,这些附加字符的方法其实现不尽相同,因此应用场景也不同。
首先我们先一窥源码(gcc 4.9.2):
basic_string.h:
//-------------------------------+=运算符重载部分---------------------------
//追加 string 类型字符串basic_string&operator+=(const basic_string& __str) { return this->append(__str); }//追加 cstring 类型字符串basic_string&operator+=(const _CharT* __s) { return this->append(__s); }//追加单个字符basic_string&operator+=(_CharT __c) { this->push_back(__c);return *this;}#if __cplusplus >= 201103L//追加字符类型的初始化列表basic_string&operator+=(initializer_list<_CharT> __l) { return this->append(__l.begin(), __l.size()); }//-------------------------------append函数实现部分---------------------------//追加 string 类型字符串basic_string&append(const basic_string& __str); //追加部分 string 类型字符串basic_string& append(const basic_string& __str, size_type __pos, size_type __n);//追加部分 cstring 类型字符串basic_string& append(const _CharT* __s, size_type __n);//追加 cstring 类型字符串basic_string& append(const _CharT* __s){__glibcxx_requires_string(__s);return this->append(__s, traits_type::length(__s));}//追加多个字符basic_string& append(size_type __n, _CharT __c);#if __cplusplus >= 201103L//追加字符类型的初始化列表basic_string& append(initializer_list<_CharT> __l){ return this->append(__l.begin(), __l.size()); }#endif // C++11template<class _InputIterator>basic_string& //附加给定范围内的多个字符append(_InputIterator __first, _InputIterator __last){ return this->replace(_M_iend(), _M_iend(), __first, __last); }//-------------------------------push_back函数实现部分---------------------------//追加单个字符voidpush_back(_CharT __c) { const size_type __len = 1 + this->size();if (__len > this->capacity() || _M_rep()->_M_is_shared())this->reserve(__len);traits_type::assign(_M_data()[this->size()], __c);_M_rep()->_M_set_length_and_sharable(__len);}
从以上源码的角度来分析append函数、push_back函数和+=运算符的不同使用场景,就非常直观了:
- += 运算符:追加单个参数值。
- append 函数:允许追加多个参数值。
- push_back 函数:只能追加单个字符。
append() | += | push_back | |
---|---|---|---|
全字符串(string) | √ | √ | × |
部分字符串(substring) | √ | × | × |
字符数组(char array) | √ | √ | × |
单个字符(char) | × | √ | √ |
迭代器范围(iterator range) | √ | × | × |
返回值(return value) | *this | *this | none |
cstring(char*) | √ | √ | × |
示例
1 全字符串(string)
- += 运算符:可以追加完整字符串。
- append 函数:也允许追加完整字符串。
- push_back 函数:不允许追加完整字符串。
// CPP code for comparison on the
// basis of appending Full String
#include <iostream>
#include <string>
using namespace std; // Function to demonstrate comparison among
// +=, append(), push_back()
void appendDemo(string str1, string str2)
{ string str = str1; // Appending using += str1 += str2; cout << "Using += : "; cout << str1 << endl; // Appending using append() str.append(str2); cout << "Using append() : "; cout << str << endl;
} // Driver code
int main()
{ string str1("Hello World! "); string str2("GeeksforGeeks"); cout << "Original String : " << str1 << endl; appendDemo(str1, str2); return 0;
}
2 追加部分字符串(substring)
- += 运算符:不允许追加部分字符串。
- append 函数:该函数允许追加部分字符串。
- push_back 函数:不支持追加部分字符串。
// CPP code for comparison on the basis of
// Appending part of string #include <iostream>
#include <string>
using namespace std; // Function to demonstrate comparison among
// +=, append(), push_back()
void appendDemo(string str1, string str2)
{ // Appends 5 characters from 0th index of // str2 to str1 str1.append(str2, 0, 5); cout << "Using append() : "; cout << str1;
} // Driver code
int main()
{ string str1("GeeksforGeeks "); string str2("Hello World! "); cout << "Original String : " << str1 << endl; appendDemo(str1, str2); return 0;
}
3 追加 C-string(char*)
- += 运算符:允许追加 C-string。
- append 函数:同样允许追加 C-string。
- push_back 函数:不允许使用 push_back 函数追加 C-string。
// CPP code for comparison on the basis of
// Appending C-string #include <iostream>
#include <string>
using namespace std; // Function to demonstrate comparison among
// +=, append(), push_back()
void appendDemo(string str)
{ string str1 = str; // Appending using += str += "GeeksforGeeks"; cout << "Using += : "; cout << str << endl; // Appending using append() str1.append("GeeksforGeeks"); cout << "Using append() : "; cout << str1 << endl;
} // Driver code
int main()
{ string str("World of "); cout << "Original String : " << str << endl; appendDemo(str); return 0;
}
4 追加字符数组(char array)
- += 运算符:允许追加字符数组。
- append 函数:同样允许追加字符数组。
- push_back 函数:不支持追加字符数组。
// CPP code for comparison on the basis of
// Appending character array #include <iostream>
#include <string>
using namespace std; // Function to demonstrate comparison among
// +=, append(), push_back()
void appendDemo(string str)
{ char ch[6] = {'G', 'e', 'e', 'k', 's', '\0'}; string str1 = str; // Appending using += str += ch; cout << "Using += : " << str << endl; // Appending using append() str1.append(ch); cout << "Using append() : "; cout << str1 << endl;
} // Driver code
int main()
{ string str("World of "); cout << "Original String : " << str << endl; appendDemo(str); return 0;
}
5 追加单个字符(char)
- += 运算符:允许使用 += 运算符追加单个字符。
- append 函数:不允许追加单个字符。
- push_back 函数:支持追加单个字符。
// CPP code for comparison on the basis of
// Appending single character #include <iostream>
#include <string>
using namespace std; // Function to demonstrate comparison among
// +=, append(), push_back()
void appendDemo(string str)
{ string str1 = str; // Appending using += str += 'C'; cout << "Using += : " << str << endl; // Appending using push_back() str1.push_back('C'); cout << "Using push_back : "; cout << str1;
} // Driver code
int main()
{ string str("AB"); cout << "Original String : " << str << endl; appendDemo(str); return 0;
}
6 迭代器范围(iterator range)
- += 运算符:不支持迭代器范围。
- append 函数:支持迭代器范围。
- push_back 函数:不支持迭代器范围。
// CPP code for comparison on the basis of
// Appending using iterator range #include <iostream>
#include <string>
using namespace std; // Function to demonstrate comparison among
// +=, append(), push_back()
void appendDemo(string str1, string str2)
{ // Appends all characters from // str2.begin()+5, str2.end() to str1 str1.append(str2.begin() + 5, str2.end()); cout << "Using append : "; cout << str1;
}
// Driver code
int main()
{ string str1("Hello World! "); string str2("GeeksforGeeks"); cout << "Original String : " << str1 << endl; appendDemo(str1, str2); return 0;
}
7 返回值(return value)
- += 运算符:返回 *this
- append 函数:返回 *this
- push_back 函数:不返回值
// CPP code for comparison on the basis of
// Return value #include <iostream>
#include <string>
using namespace std; // Function to demonstrate comparison among
// +=, append(), push_back()
string appendDemo(string str1, string str2)
{ // Appends str2 in str1 str1.append(str2); // Similarly with str1 += str2 cout << "Using append : "; // Returns *this return str1;
} // Driver code
int main()
{ string str1("Hello World! "); string str2("GeeksforGeeks"); string str; cout << "Original String : " << str1 << endl; str = appendDemo(str1, str2); cout << str; return 0;
}
(全文完)
C++的string类型中关于append函数、push_back函数和+=运算符的区别相关推荐
- C++ string类中的find()函数的简单使用
#include<iostream> using namespace std; int main(){string s1 = "abcdefa";string s2 = ...
- php with函数,string - PHP中的startsWith()和endsWith()函数
string - PHP中的startsWith()和endsWith()函数 我如何编写两个带字符串的函数,如果它以指定的字符/字符串开头或以它结尾,则返回? 例如: $str = '|apples ...
- 【ValueError: could not convert string to float: ‘young‘】python利用pandas对string类型的数据序列化
项目场景: 利用sklearn库构建决策树,使用sklearn.tree.DecisionTreeClassifier()提供的方法----fit()决策树可视化的时候,我们看到程序报错了 问题描述 ...
- C语言中的字符串与字符串函数
一.gets()函数 gets()函数在其函数声明中声明括号中的类型为char *.但当我尝试下列操作时却给出了警告:p没有使用. #include<stdio.h> int main() ...
- String类型的字符长度(码点/代码单元的区别)
查看String的源码可以发现它以一个char类型的数组保存字符串的,而String.length()方法返回的也是这个char数组的长度. 那么,这个长度和"字符"长度有什么关系 ...
- 字符、字符串和文本的处理之String类型
.Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...
- 【Redis之ZSet类型的详解ZSet类型中常用命令的实践】
Redis之ZSet类型的详解&ZSet类型中常用命令的实践 知识回顾: 通过对Redis中的String的命令做了充分的讲解以及实践学习 通过对Redis中String类型之Bit命令的详解 ...
- java把string转换为int_java如何把String类型转换为int类型
在java中,实现String类型转换为int类型的方法有:Integer.parseInt(String)方法.Integer.valueOf(String)方法. 本篇文章就给大家介绍java把S ...
- java把string转int类型_java把String类型转换为int类型的方法
java把String类型转换为int类型的方法 发布时间:2020-08-20 14:32:03 来源:亿速云 阅读:73 作者:小新 这篇文章将为大家详细讲解有关java把String类型转换为i ...
最新文章
- Shell中常用的引号
- 我的世界:一个村落(其一)
- 【积累】C/C++中明明该用函数实现的功能,为啥非要自己写代码
- 微服务实践分享(3)服务发现
- nginx源码分析--使用GDB调试
- 罚款200元的交通违法行为
- laravel 数据库操作(表、字段)
- Linix中Dockerfile部署Spring Boot项目
- minio在不同平台下的启动命令
- 中值滤波器 ( Median Filter ) C++ 实现
- VSCode远程链接Could not establish connection to “hz.matpool.com”
- puppetmaster 、agent 证书管理相关
- 04-cmake语法-STREQUAL
- 毕设题目:Matlab优化覆盖
- 2023 年十大战略技术趋势中哪一项最需要 HTAP ?
- win8配置JDK1.8环境变量
- MATLAB控制有效数字
- GO语言(golang)官方网站!
- ic618画版图2.0
- 重置form表单中的input值