C++的string类型中关于append函数、push_back函数和+=运算符的区别部分内容翻译⾃
引⾔
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&
c++中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>
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;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。