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++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*thisnone
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; 
} 


  • 22
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QVector的appendpush_back都是向QVector添加元素的函数append函数将一个元素添加到QVector的末尾,可以添加一个元素或者一个QVector。 push_back函数append函数作用相同,将一个元素添加到QVector的末尾,但是只能添加一个元素。 两者的区别在于,append函数可以添加一个QVector,而push_back函数只能添加一个元素。 ### 回答2: QVector是Qt常用的数据结构之一,它类似于C++的std::vector,可以用来存储任意类型的数据。QVector包含了很多有用的成员函数,其有两个常用的函数appendpush_back,本文将详细介绍这两个函数的用法和区别。 1. append函数 append是QVector最常用的成员函数之一,主要用于在QVector的末尾添加元素。它的语法如下: ``` void QVector::append(const T& value) ``` 其,T代表要添加的元素的类型,value是要添加的元素的值。 使用示例: ``` QVector<int> vec; vec.append(1); vec.append(2); vec.append(3); ``` 在上面的示例,我们创建了一个空的QVector<int>,然后分别使用append函数在末尾添加了1、2、3三个元素。注意,QVector是一个动态数组,它会随着元素的不断添加自动扩展大小。 2. push_back函数 push_back函数append函数类似,也用于在QVector的末尾添加元素,但是它的语法略有不同: ``` void QVector::push_back(const T& value) ``` 这里的语法与C++的std::vector相同。同样,T代表要添加的元素的类型,value是要添加的元素的值。 使用示例: ``` QVector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); ``` 这个示例与上面的示例相同,只不过使用了push_back函数来添加元素。和append函数一样,push_back函数也会自动扩展QVector的大小。 3. 区别 在使用过程,我们可以发现appendpush_back函数的用法很相似,它们都是用于在QVector的末尾添加元素。实际上,这两个函数几乎没有什么区别,唯一的区别是它们的语法略有不同。 在Qt的文档,也明确指出了append函数push_back函数区别: - append函数是QVector的成员函数,可以看做是QVector封装的一部分; - push_back函数是STLstd::vector的成员函数,Qt只是将它兼容到了QVector。 因此,推荐使用append函数,尤其是在Qt的项目,因为它更符合Qt的封装思想。只有在需要与C++的std::vector交互时,才使用push_back函数。例如,推荐使用append函数: ``` QVector<int> vec; vec.append(1); vec.append(2); vec.append(3); ``` 最后,需要注意的是,无论是append函数还是push_back函数,在连续添加大量元素时都会带来很大的性能损失,比较好的解决办法是在添加之前调用一次reserve函数,为QVector预留足够的空间。例如: ``` QVector<int> vec; vec.reserve(10000); for(int i=0; i<10000; ++i){ vec.append(i); } ``` 这样,在添加元素时,QVector不需要重新分配内存,可以避免频繁的内存分配和释放操作,提高程序性能。 ### 回答3: QVector是Qt框架提供的一个容器类,可以存储同类型的数据。在QVector,有两个常见的添加元素的方法,分别是appendpush_back。 append方法是将元素添加到QVector队尾,如果队列的长度不够大,则会自动分配空间。这个方法的时间复杂度是O(1),即添加元素的效率非常高。append函数可以使用一个对象作为参数,也可以使用一个QVector对象作为参数,将其他QVector对象的所有元素添加到当前对象push_back方法是STL标准库提供的一个添加元素的方法,在Qt也有相应的实现。push_back方法与append类似,也是将元素添加到QVector队尾,如果队列的长度不够大,则会自动分配空间。与append不同的是,push_back方法实际上是调用了append方法,时间复杂度也是O(1)。push_back函数只能使用一个对象作为参数,不能使用QVector对象作为参数。 对于两者的选择,通常情况下,选择哪个方法都无所谓,因为它们的效率几乎相同。但是有一些情况下,append方法会更加有效率。例如,如果添加的元素是一个QVector对象,使用append方法只需要分配一次内存,而使用push_back方法需要两次内存分配,这样会降低添加元素的效率。 在使用QVector时,需要注意的是,如果QVector已经分配了足够的内存,那么在添加新元素时,不会发生重新分配内存的过程。这样可以节省时间和内存,提高程序的效率和运行速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值