MrXiao

[STL] string类常用成员函数、误区总结
length():返回string长度,size()有相同效果。需要注意的是,string的length()操作并...
扫描右侧二维码阅读全文
20
2019/04

[STL] string类常用成员函数、误区总结

  • length():返回string长度,size()有相同效果。
    需要注意的是,string的length()操作并不会像C中的string.h中定义的strlen一样扫描整个字符串,理论性能更优,附strlen实现代码。
#include <stdlib.h>
size_t strlen( char *string ) //size_t stddef.h中定义的类型 等价于unsigned int
{
    int length = 0;
    // 依次访问字符串的内容,计算字符数,直至遇到NUL终止符
    while( *string++ != '\0' )
        length += 1;
    return length;
}

同样需要注意,string作为类其长度已经以成员变量形式储存,由此并不需要‘0’作为结束标志,即不需要判断字符串是否已经结束。实验中也可以看到,string并不以‘0’结尾。

  • find(): 函数原型:
size_t find ( const string& str, size_t pos = 0 ) const;
size_t find ( const char* s, size_t pos, size_t n ) const;
size_t find ( const char* s, size_t pos = 0 ) const;
size_t find ( char c, size_t pos = 0 ) const;

参数说明:
pos:查找起始位置
n:待查找字符串的前n个字符
将返回索引首字母索引,与下文其他与find相关的区分开来。

  • find_first_of(): 函数原型:
size_t find_first_of ( const string& str, size_t pos = 0 ) const;
size_t find_first_of ( const char* s, size_t pos, size_t n ) const;
size_t find_first_of ( const char* s, size_t pos = 0 ) const;
size_t find_first_of ( char c, size_t pos = 0 ) const;

参数表与find一致,但此函数查找时,只要str1含str2中任意一字符,就会返回str1中第一个命中str2中任意字符的字符索引。(即对顺次扫str1)

    string str1("I am change");
    string str2("caout");
    int k = str1.find_first_of(str2); // k = 2
    return 0;
  • erase(): 函数原型:
sequence (1)    string& erase (size_t pos = 0, size_t len = npos);
character (2)    iterator erase (iterator p);
range (3)    iterator erase (iterator first, iterator last);

注意:此方法既对字符串原地修改,也可以返回修改过后的string,后同。
pos:擦除起点索引
len: 擦除字符个数,缺省时只擦除pos位置一个字符。

还可以通过迭代器控制擦除范围,如s.erase(s.begin()+1,s.end()-1)

  • insert() : 函数原型:

string (1) string& insert (size_t pos, const string& str);

在pos位置插入str,str的第一个字符的新索引将会是pos。

  • append() :函数原型:
string (1)    string& append (const string& str);
substring (2)    string& append (const string& str, size_t subpos, size_t sublen = npos);
c-string (3)    string& append (const char* s);
buffer (4)    string& append (const char* s, size_t n);
fill (5)    string& append (size_t n, char c);
range (6)    template <class InputIterator>
   string& append (InputIterator first, InputIterator last);
initializer list(7)    
string& append (initializer_list<char> il);

例程:

// appending to string
#include <iostream>
#include <string>
int main ()
{
  std::string str;
  std::string str2="Writing ";
  std::string str3="print 10 and then 5 more";

  // used in the same order as described above:
  str.append(str2);                       // "Writing "
  str.append(str3,6,3);                   // "10 "
  str.append("dots are cool",5);          // "dots "
  str.append("here: ");                   // "here: "
  str.append(10u,'.');                    // ".........."
  str.append(str3.begin()+8,str3.end());  // " and then 5 more"
  str.append<int>(5,0x2E);                // "....."
  std::cout << str << '\n';
  return 0;
}
  • 数值类型转string利器:to_string():函数原型:
string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
  • string转char[] data() :仅简略介绍用法:
string str="abc";
char *p=str.data();
Last modification:April 20th, 2019 at 12:52 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment