1. += 简单粗暴的方法
std::string s("hello"); const char c = 'N';//将要加到s后面的字符 s += c; std::cout << s << std::endl; return 0;
在string内部对于+=这个操作符是重新写了的,如下, push_back其实就是往尾部增加一个字符,那这样看来,直接调用push_back岂不是更高效?
_CONSTEXPR20 basic_string& operator+=(_Elem _Ch) { push_back(_Ch); return *this; }
2. string内置方法push_back
std::string s("hello"); const char c = 'N';//将要加到s后面的字符 //s += c; s.push_back(c); std::cout << s << std::endl;
我们来看看push_back内部是如何实现的:
_CONSTEXPR20 void push_back(const _Elem _Ch) { // insert element at end const size_type _Old_size = _Mypair._Myval2._Mysize; if (_Old_size < _Mypair._Myval2._Myres) { _Mypair._Myval2._Mysize = _Old_size + 1; _Elem* const _Ptr = _Mypair._Myval2._Myptr(); _Traits::assign(_Ptr[_Old_size], _Ch); _Traits::assign(_Ptr[_Old_size + 1], _Elem()); return; } _Reallocate_grow_by( 1, [](_Elem* const _New_ptr, const _Elem* const _Old_ptr, const size_type _Old_size, const _Elem _Ch) { _Traits::copy(_New_ptr, _Old_ptr, _Old_size); _Traits::assign(_New_ptr[_Old_size], _Ch); _Traits::assign(_New_ptr[_Old_size + 1], _Elem()); }, _Ch); }
3. string内置方法insert
std::string s("hello"); const char c = 'N';//将要加到s后面的字符 //s += c; //s.push_back(c); s.insert(s.length(), 1, c); std::cout << s << std::endl;
以上这段代码的意思,就是往string的尾部,插入一个字符c,insert三参数。
4. string内置方法append
std::string s("hello"); const char c = 'N';//将要加到s后面的字符 //s += c; //s.push_back(c); //s.insert(s.length(), 1, c); s.append(1, c); std::cout << s << std::endl;
那么看看append是如何实现的,和push_back有啥区别,其实仔细阅读两段代码是非常相似的,只是把append中的参数count替换成1,就是push_back的实现了
_CONSTEXPR20 basic_string& append(_CRT_GUARDOVERFLOW const size_type _Count, const _Elem _Ch) { // append _Count * _Ch const size_type _Old_size = _Mypair._Myval2._Mysize; if (_Count <= _Mypair._Myval2._Myres - _Old_size) { _Mypair._Myval2._Mysize = _Old_size + _Count; _Elem* const _Old_ptr = _Mypair._Myval2._Myptr(); _Traits::assign(_Old_ptr + _Old_size, _Count, _Ch); _Traits::assign(_Old_ptr[_Old_size + _Count], _Elem()); return *this; } return _Reallocate_grow_by( _Count, [](_Elem* const _New_ptr, const _Elem* const _Old_ptr, const size_type _Old_size, const size_type _Count, const _Elem _Ch) { _Traits::copy(_New_ptr, _Old_ptr, _Old_size); _Traits::assign(_New_ptr + _Old_size, _Count, _Ch); _Traits::assign(_New_ptr[_Old_size + _Count], _Elem()); }, _Count, _Ch); }
5. 使用流的方式来操作,方式稍微有点怪,但也不难理解
#include <iostream> #include <sstream> int main() { std::string s("hello"); const char c = 'N';//将要加到s后面的字符 //s += c; //s.push_back(c); //s.insert(s.length(), 1, c); //s.append(1, c); std::stringstream ts; ts << s << c;//将字符串s和字符c输入到临时字符串流ts中 ts >> s;//ts将自己内部保存的值,反吐给s std::cout << s << std::endl; return 0; }