STL--线性容器 string

Posted 蚍蜉撼树谈何易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL--线性容器 string相关的知识,希望对你有一定的参考价值。

string介绍

在C++下为按照类的方式动态管理字符串
底层:是一种顺序表的结构,元素是char类型的字符
string提出的意义:
1.string不用担心内存越界的问题。用字符数组的话你还要担心越界的问题,但用string类不用担心这个问题,原因是底层提供相应的扩容机制。
2.在拷贝方面来说,更加的方便。不用担心拷贝所带来的数据丢失等问题。
3.string底层有一套自身的内存管理体系,不用担心其内存泄露问题,底层有自己对资源的申请、释放机制。
string 不是一种类型,而是对char*的封装的一个类。
接下来介绍一下SGI版本(Linux)下的string类的相关函数

string类的大小

底层为8个字节。在PJ版本(vs2013)为28个字节。后面会给出模拟实现。

构造函数

//无参构造
string ( );
//拷贝构造
string ( const string& str );
//区间构造
string ( const string& str, size_t pos, size_t n = npos );
//拷贝字符指针所指空间的前n个元素
string ( const char * s, size_t n );
//拷贝字符指针所指的空间的内容
string ( const char * s );
//利用n个字符来初始化string对象
string ( size_t n, char c );
//利用迭代器构造
template<class InputIterator> string (InputIterator begin, InputIterator end);
    6 void test_constructor()
    7 {
    8     //1.无参构造                                                                                                                                                                    
    9     string s1;
   10     //2参数为const char*构造
   11     string s2("hello Srting");
   12     //3.拷贝构造
   13     string s3(s2);
   14     //4.区间构造
   15     string s4(s2,0,5);
   16     //5.字符构造
   17     string s5(10,'c');
   18     const char*str="hello world";
   19     //6.迭代器构造
   20     string s6(s2.begin(),s2.begin()+5);
   21     //7.参数为char* size_t n的构造
   22     string s7(str,5);
   23     cout<<s1<<endl;
   24     cout<<s2<<endl;
   25     cout<<s3<<endl;
   26     cout<<s4<<endl;
   27     cout<<s5<<endl;
   28     cout<<s6<<endl;
   29     cout<<s7<<endl;
   30 }

在这里插入图片描述

赋值运算符的重载

//将一个string对象赋值给另一string对象
string& operator= ( const string& str );
//利用指针所指空间的内容初始化string对象
string& operator= ( const char* s );
//单个字符直接给string对象
string& operator= ( char c );
31 // 2.测试赋值运算符
   32 void test_fuzhi()
   33 {
   34     //1.参数为const string &t的
   35     string s1("hello Linux");
   36     string s2=s1;
   37     //参数为const char*的
   38     string s3="hello ubuntu";
   39     //3.参数为字符类的
   40     string s4;
   41     s4='g';
   42     cout<<s2<<endl;
   43     cout<<s3<<endl;
   44     cout<<s4<<endl;
   45 }

在这里插入图片描述

测试string下的迭代器

在这里插入图片描述
迭代器:迭代器是一种类似指针的对象,而指针的各类行为中最常见也是最重要的便是内容提领和成员的访问,因此,迭代器的最重要的作用是对operator*和operator->进行重载的工作。迭代器是一种智能指针。

//3.迭代器测试
   47 void test_Iterator()
   48 {
   49     string s1="hello Linux";
   50     //1.正向迭代器 begin(),end() 左闭右开,
W> 51     int i=0;
   52     string::iterator it =s1.begin();
   53     while(it!=s1.end())
   54     {
   55         cout<<*it<<" ";
   56         ++it;
   57     }
   58     cout<<endl;
   59     // 反向迭代器遍历 rbegin(),rend();
   60     string::reverse_iterator rit=s1.rbegin();
   61     while(rit!=s1.rend())
   62     {
   63         cout<<*rit<<" ";
   64         ++rit;
   65     }
   66     cout<<endl;
   67 }                    

在这里插入图片描述

在这里插入图片描述

测试容量与大小

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 68 // 测试容量与大小
   69 void test_size()
   70 {
   71     string s1("hello Linux");
   72     cout<<s1<<endl;
   73     cout<<s1.size()<<endl;                                                                                                                                                          
   74     cout<<s1.capacity()<<endl;
   75     string s2(100,'c');
   76     size_t ret=s2.size();   
   77     cout<<s2<<endl;             
   78     int i=100;     
   79     cout<<ret<<endl;
   80     for(;i>=0;i--)  
   81     {                       
   82         s2.reserve(i);          
   83         cout<<s2.capacity()<<endl;
   84                                   
   85     }                           
   86     //cout<<s2.size()<<endl;
   87     //cout<<s2.capacity()<<endl;
   88     //s2.reserve(1);            
   89     //cout<<s2.size()<<endl;
   90     //cout<<s2.capacity()<<endl;
   91     // s1.reserve(20);          
   92     // cout<<s1.capacity()<<endl;
   93     // s1.reserve(30);           
   94     // cout<<s1.capacity()<<endl;
   95     //                           
   96     // s1.reserve(50);
   97     // cout<<s1.capacity()<<endl;;
   98 }                                 

在这里插入图片描述
//测试SGI版本下的string扩容机制

   99 void test_reserve()
  100 {
  101     int i=0;
  102     string s1;
  103     int oldsize=s1.capacity();
  104     for(;i<100;i++)
  105 
  106     {
  107         s1.push_back('c');
W>108         if(oldsize!=s1.capacity())
  109         {
  110             cout<<s1.capacity()<<endl;
  111             oldsize=s1.capacity();
  112         }
  113     }
  114 }

二倍扩容
在这里插入图片描述

115 //测试clear empty
  116 void test_clear_empty()
  117 {
  118     string s1="hello world";
  119     cout<<s1.size()<<endl;
  120     cout<<s1.capacity()<<endl;
  121     if(s1.empty())
  122     {
  123         cout<<"空"<<endl;
  124     }
  125     else
  126     {
  127         cout<<"非空"<<endl;
  128     }
  129     s1.clear();
  130 
  131     cout<<s1.size()<<endl;
  132     cout<<s1.capacity()<<endl;
  133     if(s1.empty())
  134     {
  135         cout<<"空"<<endl;
  136     }
  137     else
  138     {
  139         cout<<"非空"<<endl;
  140     }
  141 }                

在这里插入图片描述

获取元素

在这里插入图片描述
在这里插入图片描述

// 测试[] and at
  143 void test_at()
  144 {
  145     int i=0;
  146     string s("hello Linux");                                                                                                                                                        
W>147    for(;i<s.size();i++)
  148    {
  149       cout<<s[i]<<"  ";
  150 
  151    }
  152    cout<<endl;
  153    i=0;
W>154    for(;i<s.size();i++)
  155    {
  156        cout<<s.at(i)<<"  ";
  157 
  158    }
  159    cout<<endl;
  160 }

在这里插入图片描述

string类的修改

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 168 //测试+=
  169 void test_modify()
  170 {
  171    //第一种 string& operator+= ( const string& str  );
  172    string s1="hello ";
  173    string s2="world";
  174    s1+=s2;
  175    cout<<s1<<endl;
  176    //第二中 string& operator+= ( const char* s  );
  177    string s3="hello";
  178    s3+=" world";
  179    cout<<s3<<endl;
  180    //第三种 string& operator+= ( char c  );
  181    string s4="hell";
  182    s4+='o';
  183    cout<<s4<<endl;
  184 }

在这里插入图片描述

  185 void test_append()                                                                                                                                                                  
  186 {
  187    //第一种 string& append ( const string& str  );
  188    string s1("hello");
  189    string s2(" world");
  190    s1.append(s2);
  191 
  192    cout<<s1<<endl;
  193    //第二种string& append ( const string& str, size_t pos, size_t n  );
  194    string s3;
  195    s3.append(s2,1,5);
  196    cout<<s3<<endl;
  197   //第三种 string& append ( const char* s, size_t n  );
  198    const char*str="precious";
  199    string s5;
  200    s5.append(str,5);
  201    cout<<s5<<endl;
  202    //第四种string& append ( const char* s  );
  203    string s6("hello");
  204    s6.append(" world");
  205    cout<<s6<<endl;
  206    //第五种 string& append ( size_t n, char c  );
  207    string s7;
  208    s7.append(10,'c');
  209    cout<<s7<<endl;
  210    //第六种,迭代器方式
  211    string s8("hello Linux");
  212    string s9;
  213    s9.append(s8.begin(),s8.begin()+5);
  214    cout<<s9<<endl;
  215 }

在这里插入图片描述
//测试erase

216 void test_erase()
  217 {
  218     //第一种 string& erase ( size_t pos = 0, size_t n = npos  );
  219     string s1("hello Linux");
  220     s1.erase(0,5);
  221     cout<<s1<<endl;
  222     //第二种 iterator erase ( iterator position  );
  223     string s2("hello Linix");
  224     string::iterator it=s2.begin();
  225     while(it!=s2.end())
  226     {
  227         it=s2.erase(s2.begin());
  228     }
  229     cout<<s2<<endl;
  230     cout<<s2.size()<<endl;
  231     cout<<s2.capacity()<<endl;
  232     //第三种: iterator erase ( iterator first, iterator last  );
  233     string s3("hello Linux");
  234     string::iterator rit=s3.erase(s3.begin(),s3.begin()+5);
  235     while(rit!=s3.end())
  236     {
  237         cout<<*rit;
  238         rit++;
  239     }
  240     cout<<endl;
  241 }

在这里插入图片描述
//测试swap

  242 void test_swap()
  243 {
  244    // void swap ( string& str  );
  245     string s1("hello");
  246     string s2("Linux");
  247     cout<<"before swap"<<endl;
  248     cout<<"s1="<<s1<<endl;
  249     cout<<"s2="<<s2<<endl;
  250     swap(s1,s2);
  251     cout<<"after swap"<<endl;
  252     cout<<"s1="<<s1<<endl;
  253     cout<<"s2="<<s2<<endl;
  254 
  255 }

在这里插入图片描述

测试string下的operation

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
npos=-1
在这里插入图片描述
在这里插入图片描述

 256 void test_c_str()
  257 {
  258     //const char* c_str (  ) const;
  259     string s1("hello Linux");
  260     const char*s2=s1.c_str();
  261     cout<<s2<<endl;
  262 }
  263 void test_data()
  264 {
  265     //const char* data() const;返回指向与字符串相同内容的字符数组的指针。
  266     string s1("hello Linux");
  267     char*str=new char[s1.size()+1];
  268     strcpy(str,s1.data());
  269    cout<<str<<endl; 
  270     
  271 }
  272 void test_find()
  273 {
  274    //1. size_t find ( const string& str, size_t pos = 0  ) const;
  275    string s1("hello world");
  276    string s2("world");
  277    int len1=以上是关于STL--线性容器 string的主要内容,如果未能解决你的问题,请参考以下文章

STL源代码剖析 容器 stl_vector.h

STL--线性容器 -vector

[C++STL]string容器用法介绍

STL 容器

STL容器总结

stl 容器中的搜索元素