C++的string类型中关于append函数、push_back函数和+=运算符的区别_良晨的博客-程序员资料

技术标签: C++  

部分内容翻译自 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++11

 template<class _InputIterator>
 basic_string&							//附加给定范围内的多个字符
 append(_InputIterator __first, _InputIterator __last)
 {
     return this->replace(_M_iend(), _M_iend(), __first, __last); }
 
 //-------------------------------push_back函数实现部分---------------------------
 
  //追加单个字符
  void
  push_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; 
} 


(全文完)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38537503/article/details/106279850

智能推荐

Robot Framework学习(8):Web自动化测试_csdn怀的博客-程序员资料

web自动化测试用到的库是Selenium2Library与浏览器相关的关键字1. Open Browser    https://www.baidu.com  ff/chrome    # 打开浏览器注:要想通过不同的浏览打开URL地址,一定要安装浏览器相对应的驱动2. Close Browser        # 关闭浏览器3. Close All Browser   ...

超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!_程序员书单的博客-程序员资料

​之前写过很多次关于Java学习指南、Java技术路线图的文章。但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃。于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来,做成一份非常硬核的Java学习指南+路线图,一篇文章搞定Java学习,360度无死角(可能)如果你们喜欢这类硬核的文章,以后我也会继续这么硬核下去的!不要忘了分享噢。以下就是本文的主要内容,万字长文,你可悠着点看,拒绝到收藏夹吃灰!一、Java学习路线图1 计算机基础**2**Java.

pycharm在import第三方包时出错/import requests等等出错_苏道丶的博客-程序员资料

我原本已经在cmd里设置在python安装目录下的scripts里运行了pip install requests,也已经安装成功,但是在用pycharm import 时却仍是报错说无此module。主要是使用pycharm新建工程后库不一样了。1/create new project2/选择pure python起任意文件名create3/等待加载完成4/打开lib库发现site-package...

GAMES 202 - 作业 2: Precomputed Radiance Transfer_CCCCCCros____的博客-程序员资料_games202作业2

GAMES 202 - 作业 2作业 2: Precomputed Radiance TransferGAMES 202 - 作业 2作业 2: Precomputed Radiance Transfer总览预计算球谐系数环境光照漫反射传输项Diffuse UnshadowedDiffuse ShadowedDiffuse Inter-reflection(bonus)实时球谐光照计算环境光球谐旋转结果原课程视频链接以及官网b站视频链接: https://www.bilibili.com/video/

xilinx的quick boot(1) ——flash的一些内容_weixin_30636089的博客-程序员资料

xilinx的quick boot(1) ——flash,quick boot配置文件,以及中间的一些联系xilinx 配置模式分为SPI,BPI。用过的spi外挂flash是N25Q。/////////////spi flash N25Q //////////////////////////////////////////////////flash分为区(block),扇区(sector),子扇...

pyqt5 mysql 驱动_PyQt5连接MySQL及QMYSQL driver not loaded错误解决_weixin_34570507的博客-程序员资料

一、连接语句from PyQt5.QtSql import QSqlDatabasedb=QSqlDatabase.addDatabase("QMYSQL")db.setHostName("localhost")db.setDatabaseName("dbwork")db.setUserName("users")db.setPassword("ZDSYS")db.setPort(3306)db.o...

随便推点

单文件程序库2_yazhouren的博客-程序员资料

Packageshtmk edited this page 5 days ago · 253 revisions Pages 3HomeExplanation of package.jsonPackagesClone this wiki locally Clone in DesktopLis

Android学习——控件ListView的使用_anjiukonghe77852的博客-程序员资料

一、ListView的简单用法首先新建一个ListViewTest项目,并让Android Studio自动创建好活动。然后修改activity_main.xml中的代码,如下: 1 &lt;?xml version="1.0" encoding="utf-8"?&gt; 2 &lt;LinearLayout xmlns:android="http://schemas.a...

ABAP ALV显示简单例子_土星环的土的博客-程序员资料_abap alv 例子

*&amp;---------------------------------------------------------------------**&amp;ReportZ_210113_02*&amp;---------------------------------------------------------------------**&amp;*&amp;---------------------------------------------------------------..

【数据库】查询和01号学生学习的课程完全相同的其他同学的信息_Angusis的博客-程序员资料_查询和01学生课程完全相同

今天读了几篇博客:https://blog.csdn.net/qq_41080850/article/details/84593860https://www.cnblogs.com/fengyunlishi/archive/2012/10/18/2730051.htmlhttps://blog.csdn.net/qq_41080850/article/details/84648897#co...

K-means(K均值)算法 简单实现 二维/三维结果展示_alphaTao的博客-程序员资料_kmeans三维聚类

1. 简介k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对象没有任何先验知识,而分类过程为有监督过程。k-means是最简单的聚类算法之一,应用十分广泛,k代表类簇个数,means代表类簇内数据对象的均值。k-means以距离作为相...

推荐文章

热门文章

相关标签