解读STL的string类中各方法的使用场景

所在头文件:

创新互联是一家专业提供将乐企业网站建设,专注与成都网站制作、网站建设、成都h5网站建设、小程序制作等业务。10年已为将乐众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。

实现:typedf basic_string string

所在命名空间:std

功能:标准string提供字节标准容器的接口,同事增加对字符串中单独的字符的操作。由于标准string是basic_string的一种特化,只能针对char型,如果字符编码方式是多字节或者可变字符序列(eg:UTF-8)那么它仍然按字节去解读,而不是按照传入内容的编码方式。

(1)成员函数number functions

constructor(构造函数)创建string对象 (公有成员函数)
destructor  (析构函数)销毁string对象(公有成员函数)
operator=  (赋值运算符重载)

将一个string对象赋给另一个string对象

(公有成员函数)

(2)Iterators 

beginiterator begin();
const_iterator begin() const;
返回一个迭代器指向string对象的第一个字符
enditerator end() noexcept;

const_iterator end() const noexcept;

(noexcept是c11对异常的处理方式)

返回一个迭代器指向string对象的结束字符的位置(‘\0’处),不可引用

如果是空串end=begin

rbeginreverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;

返回一个反向迭代器指向string对象的结束字符的位置

反向迭代器向后遍历-->向begin走

rendreverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;

返回一个反向迭代器指向string对象的第一个字符的位置

cbeginconst_iterator cbegin() const noexcept;
返回一个const迭代器指向string对象的第一个字符的位置
cendconst_iterator cend() const noexcept;
返回一个const迭代器指向string对象的结束字符的位置
crbeginconst_reverse_iterator crbegin() const noexcept;
返回一个const反向迭代器指向string对象的结束字符的位置
crendconst_reverse_iterator crend() const noexcept;
返回一个const反向迭代器指向string对象的第一个字符的位置

例子:

// string::begin/end
#include 
#include 
using namespace std:
void test1()
{
  string str ("Test string");
  for(string::iterator it=str.begin(); it!=str.end(); ++it)
  {
      cout << *it;
  }
  cout <

(3)Capacity

size
size_t size() const noexcept;

返回string的字节个数(size_t类型)

size!=capacity

lengthsize_t length() const noexcept;

返回string的字节个数(size_t类型)

length!=capacity

max_sizesize_t max_size() const noexcept;

返回string可以达到的最大长度

(极限范围,可能按max_size内存分配失败)

max_size!=capacity

resize
void resize (size_t n);
void resize (size_t n, char c);

重置string的长度,设置为n

重置string的长度,设置为n,内容用c填充

如果n

如果n>string的原length,先拷贝原先的在加上

c的部分(没有c,就是空字符)

capacity
size_t capacity() const noexcept;
返回已分配给string的内存的字节个数
reversevoid reserve (size_t n = 0);

改变string的capacity为n

不改变length和内容

clearvoid clear() noexcept;

清除string的内容,让string变成一个空串

length=0

emptybool empty() const noexcept;

返回string是否为空,为空返回true,非空返回

false

shrink_to_fitvoid shrink_to_fit();
减小string的capacity到size大小

例子:

#include 
#include 
using namespace std;
// comparing size, length, capacity and max_size
void test1 ()
{
  string str ("Test string");
  cout <<"size: "<< str.size() <

(4)Element access

operator[]
char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;
返回string[pos]的字符
at    char& at (size_t pos);
const char& at (size_t pos) const;
返回string[pop]的字符前会检查pos是不是字符范围内,超出范围会抛异常
backchar& back();
const char& back() const;
返回最后一个字符的引用
frontchar& front();
const char& front() const;
返回第一个字符的引用

例子:

#include 
#include 
using namespace std;
//string::operator[]
void test1()
{
    string str ("Test string");
    for(int i=0; i

(5)Modifiers

operator+=

string& operator+= (const string& str);

string& operator+= (const char* s);

string& operator+= (char n);

string& operator+= (initializer_list il);

在现有的string后面添加字符串/字符
append

string& append (const string& str);

string& append (const string& str, size_t subpos, size_t sublen);

string& append (const char* s);

string& append (const char* s, size_t n);

string& append (size_t n, char c);

template
  string& append (InputIterator first, InputIterator last);

string& append (initializer_list il);

在现有的string后面添加字符串/字符
push_back
void push_back(char c);
将字符c添加在string末尾,length++
assign

string& assign(const string& str);

string& assign(const string& str, size_t subpos, size_t sublen);

string& assign(const char * s);

string& assign(const char *s,size_t n);

string &assign(size_t n,char c);

template

 string& assign(InputIterator first,InputIterator last);

string& assign(initializer_list il);

将现有的字符串string替换成新的字符串
insert

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

string & insert (size_t pos,const string & str,size_t subpos,size_t sublen);

string & insert(size_t pos,const char *s);

string & insert(size_t pos,const char *s,size_t n);

string & insert(size_t pos,size_t n,char c);

void insert (iterator p, size_t n, char c);

iterator insert (iterator p, char c);

template
  void insert (iterator p, InputIterator first, InputIterator last);

将现有字符串string的pos位置后面插入字符串或者字符
erase

string & erase(size_t pos=o,size_t len=pos);

iterator erase(iterator p);

iterator erase(iterator first,iterator last);

将现有字符串删除一部分,length也有减少
replace

string & repalce(size_t pos,size_t len,const string& str);

string & repalce(iterator i1,iterator i2,const string &str);

string & repalce (size_t pos,size_t len,const string & str,size_t subpos,size_t sublen);

string & replace(size_t pos,size_t len,const char *s);

string & replace(iterator i1,iterator i2,const char *s);

string & repalce(size_t pos,size_t len,const char*s,size_t n);

string & repalce(iterator i1,iterator i2,const char*s,size_t n);

string & raplace(size_t pos,size_t len,size_t n,char c);

string & repalce(iterator i1,iterator i2,size_t n,chr c); 

template

 string & repalce(iterator i1, iterator i2,InputIterator first,InputIterator last); 

将现有字符串的一部分用新的字符串或者字符序列,字符去替换
swapvoid swap(string & str);
两个字符串的内容进行交换
pop_back

void pop_back();

将字符串末尾的字符删除

例子:

#include 
#include 
using namespace std;

// string::operator+=
void test1()
{
  string name ("John");
  string family ("Smith");
  name +=" K. ";   // c-string
  name += family;  // string
  name +='\n';     // character
  cout << name;
}

//string::append
void test2()
{
  string str;
  string str2="Writing ";
  string str3="print 10 and then 5 more";
  //string& append(const string &str);
  str.append(str2);    //Writing
  //string& append(const string &str,size_t pos,size_t length);
  str.append(str3,6,3);//Writing 10 
  //string& append(const char* s,size_t n);
  str.append("dots are cool",5);//Writing 10 dots 
  //string& append(const char *s); 
  str.append("here: ");//Writing 10 dots here: 
  //string& append(size_t n,char c);
  str.append(10u,'.');//Writing 10 dots here: ..........
  //strin& append(inputIterator first,inputIterator last);
  str.append(str3.begin()+8,str3.end());
  //Writing 10 dots here:......... and then 5 more
  //string& append(size_t n,)
  str.append(5,0x2E);
  //Writing 10 dots here:......... and then 5 more.....
  cout << str <(10,0x2D);
    cout << str <

(6)String operations

c_strconst char * c_str()const;
返回一个const  char *型的指针,内容是string的内容+‘\0’
dataconst char * data()const;返回一个const char *型的指针,即得到string对象的c_string形式

get_allocator

allocator_type get_allocator()const;返回一个allocator——type型的string的拷贝
copy
size_t copy(char*s,size_t len,size_t pos=0)const;

拷贝一个string中的子串到s所指的数组

(拷贝版不会自己添加'\0')

find

size_t find(cosnt string &str,size_t pos=0)const;

size_t find(const char *s,size_t pos=0)const;

size_t find(const char *s,size_t pos,size_t n)const;

size_t find(char c,size_t pos=0)const;

查找所找字符串序列第一次出现的位置
substr

string substr(size_t pos=0,size_t len=npos)const;

返回子串
compare

int compare(const string& str)const;

int compare(size_t pos,size_t len,const string &str)const;

int compare(size_t pos,size_t len,const string &str,size_t subpos,size_t 

sublen)const;

int compare(const char* s)const;

int compare(size_t pos,size_t len,const char *s)const;

int compare(size_t pos,size_tlen,const char *s,size_t n)const;

比较两个字符串

例子:

#include 
#include 
using namespace std;
//string::c_str()
void test1()
{
    string str ("Please split this sentence into tokens");
    char* cstr =newchar[str.length()+1];
    strcpy (cstr, str.c_str());
    // cstr now contains a c-string copy of str
    char* p = strtok (cstr," "); //线程不安全的字符串分割函数
    while(p!=0)
    {
      cout << p <

(7)成员常量

 

npos

size_t的最大范围

static const int npos=-1;

(定义时就初始化) 

(8)非成员函数的重载

operator+串联字符串
relational operator

各种运算符的重载

swap

交换两个字符串,std所属函数,非string所属

operator>>

输入一个字符串

operator<<

输出一个字符串

getline

将输入的数据is传入到str字符串中,遇到定界符delim时停止

将输入的数据is传入到str字符串中,到文件结束


当前文章:解读STL的string类中各方法的使用场景
浏览路径:http://hbruida.cn/article/jhhcee.html