stl string 容器的使用

string 是基本的字符串序列容器,对应数据结构中的串,和vector<char>也类似,但功能更多

string 容器的使用

  1,string 的构造函数是。  string()

  2,string的添加函数,。    insert(),push_back()

  3,string的遍历。        数组形式遍历,迭代器形式遍历

  4,string的字符串替换    replace()

  5,string 的字符搜索    find()

  6,其他的常见函数     size(),length(),empty()

#include<iostream>
using namespace std;
#include<string>
void test1();//测试string的构造函数
void test2();////测试字符添加函数
void testPrint();//测试string的遍历
void testErase();//测试string的字符删除
void testReplace();//测试string的字符串替换
void testFind();//测试字符搜索函数
void testOthers();//测试其他常见函数
void print1(string &s);//使用数组形式遍历,和vector,数组的遍历非常相似
void print2(string &s);//使用正向迭代器iterator遍历
void print3(string &s);//使用反向迭代器reverse_iterator遍历
int main(void)
{
    test1();
    test2();
    testPrint();
    testErase();
    testReplace();
    testFind();
    testOthers();
    getchar();
}
void test1()//测试string的构造函数
{
    /*
    string的构造函数
    string();//创建空的string对象
    string(const char *p);//使用字符串p,构造一个srring 对象
    string(const string &s);//由一个string对象s,构造一个新的string对象。
    string(const string &s,size_type=0,size_type n=npos);//将string对象s的[pos,pos+n)拷贝到新建的对象中
    */
    cout<<"-------测试string的构造函数--------------------"<<endl;
    char *p="I love Shanghai";

    string s1;//1.创建空的string对象s;
    s1=p;//将字符串p赋值给s1
    string s2(p);//将字符串数组p拷贝到新建的对象s2中
    string s3(s2);//使用一个对象s2创建一个新的对象s3
    string s4(s3,0,6);//使用string对象s3的[0,6)个字符创建新的string对象s4

    cout<<"对象s1:"<<s1<<endl;
    cout<<"对象s2:"<<s2<<endl;
    cout<<"对象s3:"<<s3<<endl;
    cout<<"对象s4:"<<s4<<endl;

}
void test2()//测试字符添加函数
{
    /*
    void push_back(char c) //在string对象的尾部添加字符c
    string & append(const char *s)//在string对象的尾部加字符串s
    string & append(const string &s)//在string对象的尾部加s对象的字符串
    itertor insert(iterator pos,const char &c)//在string对象 pos之前插入字符c
    string 还重载运算符+,+=
    */
    cout<<"---------测试字符添加函数------------------"<<endl;
    string str1;
    str1.push_back(‘a‘);
    str1.push_back(‘b‘);
    cout<<"str1:"<<str1<<endl;
    char *p="cdef";
    string str2(p);
    cout<<"str2:"<<str2<<endl;
    str1.append(str2);
    cout<<"append str2后str1:"<<str1<<endl;
    str1.insert(str1.begin()+3,‘8‘);//在str1[3]字符之前加字符8
    cout<<"insert后,str1:"<<str1<<endl;
    string str3;
    str3=str1+str2;
    cout<<"s3=s1+s2:"<<str3<<endl;

}
void print1(string &s)//使用数组形式遍历,和vector,数组的遍历非常相似
{
    cout<<"使用数组形式遍历:";
    for(int i=0;i<s.size();i++)
    {
        cout<<s[i];
    }
    cout<<endl;
}
void print2(string &s)//使用正向迭代器iterator遍历
{
    cout<<"使用正向迭代器iterator遍历:";
    string::iterator i;
    for(i=s.begin();i<s.end();i++)
    {
        cout<<*i;//迭代器只能用*号,不像指针一样可以用数组形式s[i]
    }
    cout<<endl;
}
void print3(string &s)//使用反向迭代器reverse_iterator遍历
{
    cout<<"使用反向迭代器reverse_iterator反向遍历:";
    string::reverse_iterator i;
    for(i=s.rbegin();i<s.rend();i++)
    {
        cout<<*i;
    }
    cout<<endl;
}
void testPrint()//测试string的遍历
{
    cout<<"-------测试string的遍历-----------------"<<endl;
    char *p="I Love China!";
    string s(p);
    cout<<"string对象s:"<<s<<endl;
    print1(s);
    print2(s);
    print3(s);
}
void testErase()//测试字符的删除函数
{
    /*
    erase函数的原型如下:
    (1)string& erase ( size_type pos = 0, size_type n = npos );//从本质上来说,是一个整型数。关键是由于机器的环境,它的长度有可能不同。
    (2)iterator erase ( iterator position );
    (3)iterator erase ( iterator first, iterator last );
    也就是说有三种用法:
    (1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
    (2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
    (3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器),[first,last)
    */
    cout<<"-------测试string的字符删除-----------------"<<endl;
    char *p="123456789";
    string s(p);
    cout<<"s:"<<s<<endl;

    s.erase(2,4);//删除s[2]开始的4个字符
    cout<<"s:"<<s<<endl;

    s.erase(s.begin());//删除迭代器s.bengin()处的字符
    cout<<"s:"<<s<<endl;

    s.erase(s.begin(),s.begin()+2);//删除bengin到begin+1之前的字符【begin,begin+2)
    cout<<"s:"<<s<<endl;

    s.clear();//清楚所有字符
    cout<<"s:"<<s<<endl;
}
void testReplace()//测试string的字符串替换
{
    /*
    string & replace(size_type pos,size_type n,const char*s)//将pos开始的n个字符,替换为字符串s;
    string & replace(size_type pos,size_type n,int m,char c )//将pos开始的n个字符,替换为m个字符c
    string & replace(iterator first,iterator last,const char *s)//将当前字符串的[first,last)替换为字符串s
    */
    cout<<"-----------测试string的字符串替换--------------"<<endl;
    char *p="Hello,boy!";
    string s(p);
    cout<<"s: "<<s<<endl;

    s.replace(6,3,"girls");//将s[6]开始的3个字符,替换为字符串girls;
    cout<<"s: "<<s<<endl;

    s.replace(11,1,2,‘!‘);//将s[11]开始的1个字符,替换为2个字符‘!‘
    cout<<"s: "<<s<<endl;

    s.replace(s.begin(),s.begin()+5,"I Love");//将begin到.begin+5之间的字符替换为“I Love”
    cout<<"s: "<<s<<endl;
}
void testFind()//测试字符搜索函数
{
    /*
    size_type find(const char *s,size_type pos=0);//在当前字符串的pos位置开始,查找子串s,找到返回索引,没找到返回-1
    size_type find(const char c,size_type pos=0);//在当前字符串的pos位置开始,查找字符c的位置,找到返回索引,没找到返回-1
    size_type rfind(const char *s,size_type rpos=0);//在当前字符串的pos位置开始,反向查找子串s,找到返回索引,没找到返回-1
    size_type find_first_of(const char *s,size_type rpos=0);//在当前字符串的pos位置开始,查找位于子串的字符,找到返回索引,没找到返回-1
    size_type find_not_first_of(const char *s,size_type rpos=0);//在当前字符串的pos位置开始,查找第一个不位于子串的字符,找到返回索引,没找到返回-1
    */
    cout<<"------测试字符搜索函数---------------"<<endl;
    string s("dog bird chicken bird cat dog");
    for(int i=0;i<s.size();i++)
    {
        cout<<"s["<<i<<"]="<<s[i]<<"  ";
    }
    cout<<endl;

    cout<<"s: "<<s<<endl;
    //字符串查找
    cout<<s.find("bird")<<endl;
    cout<<(int)s.find("pig")<<endl;//返回的类型是size_type. size_type从本质上来说,是一个整型数。关键是由于机器的环境,它的长度有可能不同。
    //字符查找
    cout<<s.find(‘i‘,7)<<endl;//从s[7]开始找字符i,找到返回pos
    //c从字符串末尾开始查找字符串和字符
    cout<<s.rfind("bird")<<endl;
    cout<<s.rfind(‘i‘)<<endl;
    cout<<s.find_first_of("12dog34")<<endl;//s中的字符d第一个出现在“12dog34”返回0
    cout<<s.find_first_not_of("d34")<<endl;//s中的字符o是第一个没有出现在字符“d34”,返回1
    cout<<s.find_last_of("12dog34")<<endl;//s中的字符d,最后出现在“12dog34”的下标是28 ,返回28
    cout<<s.find_last_not_of("d34")<<endl;//s中最后一个不位于“d34”的字符g,下标是28
}
void testOthers()//其他常见函数
{
    cout<<"-----------测试其他常见函数---------------"<<endl;
    string s1;
    string s2;
    cout<<s1.empty()<<endl;//空返回1
    cout<<s1.compare(s2)<<endl;//两个字符串对象都为空,相等返回0
    s1+="123456789";
    cout<<s1.compare(s2)<<endl;//两个字符串对象不相等,返回1
    cout<<s1.compare("123456789")<<endl;//对象s1的字符串和“123456789”相等,返回0
    cout<<s1.empty()<<endl;//不为空返回0

    cout<<"s1.size="<<s1.size()<<endl;//s1的有9个字符,返回9
    cout<<"s1.length="<<s1.length()<<endl;//s1.length()放回9
    cout<<"s1.capacity="<<s1.capacity()<<endl;

    const char *cArray=s1.c_str();//转化为常量 字符数组
    cout<<cArray[5]<<endl;
}
void testSubstr()
{
     string a = "0123456789abcdefghij";
     cout<<a<<endl;
     string sub1 = a.substr(10);//从a[10]开始,全部
     cout << sub1 << ‘\n‘;

     string sub2 = a.substr(5, 3);//从a[5]开始,长度为3
     cout << sub2 << ‘\n‘;
     string sub3 = a.substr(12, 100);//从a[12]开始,长度为100
     cout << sub3 << ‘\n‘;
}

 

stl string 容器的使用,布布扣,bubuko.com

时间: 2024-08-03 11:25:14

stl string 容器的使用的相关文章

C++ STL vector容器学习

STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector,list, deque, set, map等),算法完成特定任务,迭代器用来遍历容器对象,扮演容器和算法之间的胶合剂. 模板类vector 在计算中,矢量(vector)对应数组,它的数据安排以及操作方式,与array非常类似.在C++中,使用vector模板类时,需要头文件包含#include<v

基于内存查看STL常用容器内容

有时候在线上使用gdb调试程序core问题时,可能没有符号文件,拿到的仅是一个内存地址,如果这个指向的是一个STL对象,那么如何查看这个对象的内容呢? 只需要知道STL各个容器的数据结构实现,就可以查看其内容.本文描述了SGI STL实现中常用容器的数据结构,以及如何在gdb中查看其内容. string string,即basic_string bits/basic_string.h: mutable _Alloc_hider _M_dataplus; ... const _CharT* c_s

Effective STL --关联容器

高效STL-关联容器 标准关联容器中最重要的就是基于等价而不是相等.比如对于基本的函数库有find函数,但是对于set关联容器也是有find成员函数的.因为标准关联容器保持有序,所以每一个容器必须有一个定义了怎么保持东西有序的比较函数(默认是less).等价是根据这个比较函数定义的,所以标准关联容器的用户只需要为他们要使用的任意容器指定一个比较函数 必须为指针的关联容器指定比较类型 一定要明确对于一个容器来说,容器内的迭代器是存入该容器对象的指针,比如一个关联容器存入指针类型,那么使用这个容器的

c++ stl deque容器

c++中,Deque容器和vector相似,deque内部也采用动态数组来管理元素,支持随机存取..头文件<deque> 1.deque和vector的不同之处: 1)两端都可以较快速地按插元素和删除元素,而vector只能在尾端进行 2)在对内存有所限制的系统中,deque可以包含更多的元素,因为它不止一块内存.因此deque的max_size()可能更大 3)deque不支持对容量和内存的重分配时机的控制. 4)deque的内存区块不再被使用时,会被释放.deque的内存大小是可缩减的,由

C++ STL map容器的说明测试1

// maptest.cpp : 定义控制台应用程序的入口点.// #include "stdafx.h" /************************************************************************** Map的特点: 1.存储Key-value对* 2.支持快速查找,查找的复杂度基本是Log(N)* 3.快速插入,快速删除,快速修改记*/**********************************************

STL顺序容器【vector】【deque】【list】

我们都知道,stl容器中将容器分为两类,顺序容器和关联容器. 顺序容器有三种即vector,deque,以及list 一:顺序容器的常用操作 1:首先顺序容器的迭代器 定义:T<C>::iterator iter; /*支持所有顺序容器*/ *iter返回迭代器的引用 iter->mem 对iter解引用,等效于(*iter).men ++iter|iter++自加 --iter|iter--自减 iter1==iter2  |  iter1!=iter2比较 /*只支持vector 和

C++标准模板库Stand Template Library(STL)简介与STL string类

参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进行过学习和总结,但并没有一个宏观上的把握,现在通过上一篇和这一篇博文,将对C++模板以及基于C++模板的STL关联起来,形成一个总体的把握,对于掌握C++中模板(template)这一强有力的工具会十分有帮助.本文的主要内容有: (1) STL容器: (2) STL迭代器: (3) STL算法: (4) ST

STL Vector容器

STL Vector容器 Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器.        vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲).         vector尾部添加或移除元素非常快速.但是在中部或头部插入元素或移除元素比较费时        头文件:#include<vector> vector对象的默认构造 vector采用模板类实现, vector对象的默认构造形式: vector<T>

c++复习:STL之容器

1 STL的string 1 String概念 string是STL的字符串类型,通常用来表示字符串.而在使用string之前,字符串通常是用char*表示的.string与char*都可以用来表示字符串,那么二者有什么区别呢. string和char*的比较 string是一个类, char*是一个指向字符的指针. string封装了char*,管理这个字符串,是一个char*型的容器. string不用考虑内存释放和越界. string管理char*所分配的内存.每一次string的复制,取