部分内容翻译自 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函数和+=运算符的区别相关推荐

  1. C++ string类中的find()函数的简单使用

    #include<iostream> using namespace std; int main(){string s1 = "abcdefa";string s2 = ...

  2. php with函数,string - PHP中的startsWith()和endsWith()函数

    string - PHP中的startsWith()和endsWith()函数 我如何编写两个带字符串的函数,如果它以指定的字符/字符串开头或以它结尾,则返回? 例如: $str = '|apples ...

  3. 【ValueError: could not convert string to float: ‘young‘】python利用pandas对string类型的数据序列化

    项目场景: 利用sklearn库构建决策树,使用sklearn.tree.DecisionTreeClassifier()提供的方法----fit()决策树可视化的时候,我们看到程序报错了 问题描述 ...

  4. C语言中的字符串与字符串函数

    一.gets()函数 gets()函数在其函数声明中声明括号中的类型为char *.但当我尝试下列操作时却给出了警告:p没有使用. #include<stdio.h> int main() ...

  5. String类型的字符长度(码点/代码单元的区别)

    查看String的源码可以发现它以一个char类型的数组保存字符串的,而String.length()方法返回的也是这个char数组的长度. 那么,这个长度和"字符"长度有什么关系 ...

  6. 字符、字符串和文本的处理之String类型

    .Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...

  7. 【Redis之ZSet类型的详解ZSet类型中常用命令的实践】

    Redis之ZSet类型的详解&ZSet类型中常用命令的实践 知识回顾: 通过对Redis中的String的命令做了充分的讲解以及实践学习 通过对Redis中String类型之Bit命令的详解 ...

  8. java把string转换为int_java如何把String类型转换为int类型

    在java中,实现String类型转换为int类型的方法有:Integer.parseInt(String)方法.Integer.valueOf(String)方法. 本篇文章就给大家介绍java把S ...

  9. java把string转int类型_java把String类型转换为int类型的方法

    java把String类型转换为int类型的方法 发布时间:2020-08-20 14:32:03 来源:亿速云 阅读:73 作者:小新 这篇文章将为大家详细讲解有关java把String类型转换为i ...

最新文章

  1. Shell中常用的引号
  2. 我的世界:一个村落(其一)
  3. 【积累】C/C++中明明该用函数实现的功能,为啥非要自己写代码
  4. 微服务实践分享(3)服务发现
  5. nginx源码分析--使用GDB调试
  6. 罚款200元的交通违法行为
  7. laravel 数据库操作(表、字段)
  8. Linix中Dockerfile部署Spring Boot项目
  9. minio在不同平台下的启动命令
  10. 中值滤波器 ( Median Filter ) C++ 实现
  11. VSCode远程链接Could not establish connection to “hz.matpool.com”
  12. puppetmaster 、agent 证书管理相关
  13. 04-cmake语法-STREQUAL
  14. 毕设题目:Matlab优化覆盖
  15. 2023 年十大战略技术趋势中哪一项最需要 HTAP ?
  16. win8配置JDK1.8环境变量
  17. MATLAB控制有效数字
  18. GO语言(golang)官方网站!
  19. ic618画版图2.0
  20. 重置form表单中的input值

热门文章

  1. ArcGIS属性表批量替换
  2. 1.2 GBase 8d 目录服务产品线构架
  3. python中地址路径的间隔符在字符中的表示
  4. 影响计算机应用程序执行速度的因素,影响电脑运行速度的因素有哪些
  5. 涂鸦跳跃 java,涂鸦跳跃java
  6. linux centos 卸载安装java jdk
  7. 用友U8对接打通旺店通·企业奇门获取产成品入库单列表接口与创建其他入库单接口
  8. 数据可视化7_股票K线图
  9. 【Bioinfo Blog 007】——Perl与Python的异同整理
  10. Sybyl表面设置颜色参数