
_START_ARTICLE_
String (C++标准库)
_START_SECTION_
std::basic_string类模板
_START_PARAGRAPH_
std::basic_string类模板存储且操纵类似char的对象的序列。该对象类型的性质由特性类模板std::char_traits的实例来提供，并作为std::basic_string的第二个模板参数。_NEWLINE_C++11标准规定：basic_string的元素是连续存储的。即对于basic_string s，有：&*(s.begin() + n) == &*s.begin() + n，其中n属于[0, s.size())。换句话说，指向s[0]的指针即为指向CharT[]数组的首元素指针。C++11已经禁止了写入时复制（copy-on-write)的实现，因为存在多线程安全问题。一般都采用了小字符串优化（SSO）实现，如Visual C++：_NEWLINE_union _Bxty_NEWLINE_    {   // storage for small buffer or pointer to larger one_NEWLINE_    _Elem _Buf[_BUF_SIZE];_NEWLINE_    _Elem *_Ptr;_NEWLINE_    } _Bx; _NEWLINE_size_type _Mysize;  // current length of stringsize_type _Myres;   // current storage reserved for string_NEWLINE_GCC从版本5开始，std::string不再采用COW策略。_NEWLINE_C++17标准规定，basic_string是AllocatorAwareContainer, SequenceContainer与ContiguousContainer。
_START_SECTION_
用法
_START_PARAGRAPH_
#include <iostream>#include <string>int main(){_NEWLINE_    std::string foo = "fighters";_NEWLINE_    std::string bar = "stool";_NEWLINE__NEWLINE_    // "!=" compares string contents for inequality, even though they are different objects._NEWLINE_    if(foo != bar)_NEWLINE_    {_NEWLINE_        std::cout << "The strings are different." << std::endl;_NEWLINE_    }_NEWLINE__NEWLINE_    // Prints "stool fighters" by creating a temporary object, which is automatically freed._NEWLINE_    std::cout << bar + " " + foo << std::endl;_NEWLINE__NEWLINE_    return 0;}/* Output: The strings are different. stool fighters*/_NEWLINE_由于字符串的拷贝操作与其字节长度成比例，是O（n）量级。且创建字符串的临时栈对象的成本开销。因此string一般作为常量引用（reference-to-const）以避免不必要的拷贝：_NEWLINE_void print_the_string(const std::string& str){_NEWLINE_    std::cout << str;}_NEWLINE_c_str()成员函数返回string类的C语言风格字符串（即ASCII-零串）的指针，用于C语言字符串的互操作。如果不需要零结尾的字符串，那么成员函数data()返回不一定是0结尾的字符串的内存地址。