当前位置 博文首页 > android葱的博客:C++ STL—String

    android葱的博客:C++ STL—String

    作者:[db:作者] 时间:2021-08-19 15:46

    string 类的 string::npos 可同时定义字符串的最大长度,通常设置为无符号 int 的最大值。string 类包含了 6 个构造函数。string 类支持 cin 方式和 getline() 方式两种输入方式。简单示例如下:

    string stuff;
    cin >> stuff;
    getline(cin, stuff);

    上述三行代码,第一行是声明 string 类的对象 stuff,第二行是从屏幕读入输入的字符串,第三行同样实现第二行代码的功能。

    c++ String

    函数名称

    功能

    示例

    构造函数

    产生或复制字符串

    string strs //生成空字符串
    string s(str) //生成字符串str的复制品
    string s(str, stridx) //将字符串str中始于stridx的部分作为构造函数的初值
    string s(str, strbegin, strlen) //将字符串str中始于strbegin、长度为strlen的部分作为字符串初值

    string s(num, c) //生成一个字符串,包含num个c字符

    string s(str.begin(),str.end()); //复制字符串 str 的所有元素

    析构函数

    销毁字符串

    ~string() //销毁所有内存,释放内存

    =,assign

    赋以新值

    stuff.assign("csc"); // "csc"替换原字符串的全部内容
    stuff.assign("csc",1,2); // "csc"从1开始的2个字符替换原字符串? "sc"
    stuff.assign("csc",2); // "csc"的前2个字符替换原字符串? "cs"
    stuff.assign(5,'c'); //将原字符串替换为5个字符

    Swap

    交换两个字符串的内容

    swap (str, str2);

    str.swap (str2);

    +=,append( ),push_back()

    添加字符

    • basic_string& append (const E * s); //在原始字符串后面追加字符串s

    • basic_string& append (const E * s, size_type n);//在原始字符串后面追加字符串 s 的前 n 个字符

    • basic_string& append (const basic_string& str, size_type pos,size_type n);//在原始字符串后面追加字符串 s 的子串 s [ pos,…,pos +n -1]

    insert ()

    插入字符

    A = “ello” ? B = “H"

    B.insert(0,A); // “elloH" ? ? ?B.insert(1,A); ?// “Hello"

    B.insert(1,A,3); // “Ho”

    B.insert(1,A,1,2) // “Hll”

    B.insert (1 , 5 , 'C’); // “?HCCCCC”

    string::iterator it = B.begin() + 1;
    string::iterator itF = A.begin();
    string::iterator itG = A.end();
    B.insert(it, itF, (--itG)); // "Hell"

    erase()

    删除字符

    (1)erase( pos, n); 删除从pos开始的n个字符,例如erase( 0, 1),删除0位置的一个字符,即删除第一个字符

    (2)erase( position); 删除position处的一个字符(position是个string类型的迭代器)

    (3)erase(first,last);删除从first到last之间的字符,(first和last都是迭代器)

    clear ()

    移除全部字符

    ?

    resize ()

    改变字符数量

    调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。 ? ?str.resize(10,'b');

    replace()

    替换字符

    string A("Hello”); ? string B("word”);

    B.replace(2,1,A); ?//“woHellod"

    B.replace(2,1,A,2); ?//“wollod"

    B.replace(2,1,A,2,2); //“wolld"

    • basic_string& replace (size_type p0, size_type n0, const basic_string& str, size_type pos, size_type n); ?//使用串 str 的子串 str [pos, pos + n-1] 替换源串中的内容,从位置 p0 处开始替换,替换字符 n0 个

    • basic_string& replace (size_type p0, size_type n0, size_type n, E c); //使用 n 个字符 'c' 替换源串中位置 p0 处开始的 n0 个字符

    • basic_string& replace (iterator first0, iterator last0, const_iterator first, const_iterator last); //使用迭代器替换

    +

    串联字符串

    ?

    ==,!?=,<,<=,>,>=,compare()

    比较字符串内容

    如果相比较的两个子串相同,compare() 函数返回 0,否则返回非零值。

    ?A = “aBcdef” ? ? B = “AbcdEf"

    intm=A.compare(B);//完整的A和B的比较

    int?p=A.compare(1,5,B,4,2);//"Bcdef"和"Ef"比较

    size(),length()

    返回字符数量

    • size() 和 length():这两个函数会返回 string 类型对象中的字符个数,且它们的执行效果相同。

    • max_size():max_size() 函数返回 string 类型对象最多包含的字符数。一旦程序使用长度超过 max_size() 的 string 操作,编译器会拋出 length_error 异常。

    • capacity():该函数返回在重新分配内存之前,string 类型对象所能包含的最大字符数。

    max_size ()

    返回字符的最大可能个数

    ?

    empty ()

    判断字符串是否为空

    ?

    capacity ()

    返回重新分配之前的字符容量

    ?

    reserve()

    保留内存以存储一定数量的字符

    调用该函数可以为 string 类型对象重新分配内存。重新分配的大小由其参数决定。reserve() 的默认参数为 0。为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。

    [],at()

    存取单一字符

    • 下标操作符 [] 在使用时不检查索引的有效性,如果下标超出字符的长度范围,会示导致未定义行为。对于常量字符串,使用下标操作符时,字符串的最后字符(即 '\0')是有效的。对应 string 类型对象(常量型)最后一个字符的下标是有效的,调用返回字符 '\0'。

    • 函数 at() 在使用时会检查下标是否有效。如果给定的下标超出字符的长度范围,系统会抛出 out_of_range 异常。

    >>,getline()

    从 stream 中读取某值

    string stuff;

    cin >> stuff;

    getline(cin, stuff);

    <<

    将值写入 stream

    getline(cin, s1); ? //?第 1 个参数是输入流,第 2 个参数保存输入的字符串.

    getline(cin, s2, '?‘); ?//?“hello csc” ?s2 = hello ?第 3 个参数指定分界符。

    copy()

    将内容复制为一个 C - string

    ?

    c_str()

    将内容以 C - string 形式返回

    生成一个const char*指针,指向一个临时数组。

    ?

    data()

    将内容以字符数组形式返回

    substr()

    返回子字符串

    s.substr(pos, n) ?//返回一个string,包含s中从pos开始的n个字符的拷贝, pos默认为0,n默认为s.size() - pos。

    find()

    搜寻某子字符串或字符

    • size_type find (const value_type* _Ptr , size_type _Off = 0) const; ?//find()函数的第1个参数是被搜索的字符串,第2个参数是在源串中开始搜索的下标位置

    • size_type find (const value_type* _Ptr, size_type _Off = 0, size_type _Count) const; ?//第1个参数是被搜索的字符串,第2个参数是源串中开始搜索的下标,第3个参数是关于第1个参数的字符个数,可能是 _Ptr 的所有字符数,也可能是 _Ptr 的子串宇符个数

    begin( ),end()

    提供正向迭代器支持

    ?

    rbegin(),rend()

    提供逆向迭代器支持

    ?

    get_allocator()

    返回配置器

    ?

    最后一个有趣的东西

    string B("abcd");
    B = "ef";
    
    cout << B.size() << endl; // 2
    cout << B << endl; //ef
    cout << B[2] << endl; // '/0'
    cout << B[3] << endl; // d

    ?

    string和数值类型转换

    c++11提供了to_string方法,可以方便的将各种数值类型转换为 字符串类型:

    std::string to_string(int value);

    std::string to_string(long int value);

    std::string to_string(long long int value);

    std::string to_string(unsigned int value);

    std::string to_string(unsigned long long int value);

    std::string to_string(float value);

    std::string to_string(double value);

    ?

    std::wstring to_wstring(int value);

    。。。。。。。。。。。。。。。

    ?还提供了sto...方法,将string转换为各种类型的数据:

    std::string str = "1000";

    int val = std::stoi(str);

    long val = std::stol(str);

    float val = std::stof(str);

    ?c++11还提供了字符串(char*)转换为整数和浮点类型的方法:

    atoi: 将字符串转换为 int

    atol: 将字符串转换为long

    atoll:将字符串转换为 long long

    atof: 将字符串转换为浮点数

    ?to_string 的一个小应用

    //十进制转二进制 —— string实现
    string dectobin1(const int& n){
    	int a = n;
    	string s;
    	while(a){
    		s = to_string(a%2) + s;
    		a >>= 1;
    	}
    	return s;
    }

    后面还有栈(stack)实现的十进制转化为二进制STL——stack

    string的小实用工具:模拟java中的split函数——字符串分割

    cs