C++STL练习

vector

初始化,基本属性,访问,删除最后一个元素

//vector

    vector<int> vec;
    cout<<"vector size = "<<vec.size()<<endl;
    cout<<"vector capcity = "<<vec.capacity()<<endl;
//初始化vector
    for(int i=0; i<5; i++)
    {
        vec.push_back(i);
    }
    cout<<"extent vector size = "<<vec.size()<<endl;
    cout<<"extent vector capcity = "<<vec.capacity()<<endl;
//用下标访问vector
    for(int i=0; i<5; i++)
    {
        cout<<"value of vec ["<<i<<"] is "<<vec[i]<<endl;
    }

//用迭代器访问vector
//迭代器可以理解为光标,或者表盘上的露出日期的格子。
//当动态数组移动到了新的地址空间,指针只能指向原来的空间。但是用迭代器会自动改变指向的位置

    for(vector<int>::iterator v=vec.begin(); v!=vec.end(); v++)
    {
        cout<<*v<<endl;
    }

    vec.pop_back();  //删除最后一个元素
    cout<<"the size of vec after pop_back : "<<vec.size()<<endl;
    vec_insert();
    vec_del();

插入

void vec_insert()
{
    //创建一个vector,放置字母表前十个字母
    vector<char> alphaVector;
    for(int i=0; i<10; i++)
    {
        alphaVector.push_back(i+65);
    }

    //在第二个位置前插入4个C
    vector<char>::iterator i=alphaVector.begin();
    alphaVector.insert(i+1,4,'C');  //有些迭代器可以直接+1

    for(i=alphaVector.begin(); i!=alphaVector.end(); i++)
        cout<<*i;
    cout<<endl;

    sort(alphaVector.begin(),alphaVector.end());
    for(i=alphaVector.begin(); i!=alphaVector.end(); i++)
        cout<<*i;
    cout<<endl;
    cout<<endl;
}

删除

void vec_del()
{
//创建一个vector,放置字母表前十个字母
    vector<char> alphaVector;
    for(int i=0; i<=10; i++)
    {
        alphaVector.push_back(i+65);
    }

    int size=alphaVector.size();

    vector<char>::iterator start;
    vector<char>::iterator temp;

    for(temp=alphaVector.begin(); temp!=alphaVector.end(); temp++)
        cout<<*temp;
    cout<<endl;

    for(int i=0; i<size; i++)
    {
        start=alphaVector.begin();
        alphaVector.erase(start);

        for(temp=alphaVector.begin(); temp!=alphaVector.end(); temp++)
            cout<<*temp;

        cout<<endl;

    }

}

stack

入栈,取栈顶元素,出栈

//list<int> values{1,2,3}; //C++11支持
//stack<int,list<int>> my_stack(values);   //把list里的元素全部压到栈my_stack中
    
    //stack
    stack<int> my_stack;
    my_stack.push(1);
    my_stack.push(2);
    my_stack.push(3);

    cout<<"size of mystack: "<<my_stack.size()<<endl;
    while(!my_stack.empty())
    {
        cout<<my_stack.top()<<endl;
        my_stack.pop();
    }

list

初始化,访问,插入,删除

//list
    std::list<double> values;
    values.push_back(3.1);
    values.push_back(2.2);
    values.push_back(2.9);
    cout<<"values size: "<<values.size()<<endl;
    values.sort();

    for(std::list<double>::iterator it=values.begin(); it!=values.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

//在第一个元素后面插入5.6
    list<double>::iterator begin=values.begin();
    begin++;
    values.insert(begin,5.6);

    for(std::list<double>::iterator it=values.begin(); it!=values.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

//从尾部开始
    list<double>::iterator end=values.end();
    end--; //尾部是不能取到的
    values.erase(end);

    for(std::list<double>::iterator it=values.begin(); it!=values.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

string

.substr()生成子串

void str_substr()
{
    string s="abcdefg";
    string s2=s.substr(1,5); //bcdef,返回pos1后面的n个字符组成的串
    cout<<s2<<endl;

    string s3=s.substr(4);  //efg,第二个默认参数为npos,结尾
    cout<<s3<<endl;
}

.find() .find_first_of()串中字符查找

void str_find()
{
    string s1("Source Code");
    int n;
    //查找u出现的位置,没找到返回npos就是-1
    if((n=s1.find('u')) != string::npos)
        cout<<"1) "<<n<<","<<s1.substr(n)<<endl;  //下标从0开始,u第三个,所以u的下标是2
    //从pos1开始,查找u出现的位置,找不到
    if((n=s1.find("Source",1))== string::npos)
        cout<<"2) "<<"Not Found" <<endl;
    //从pos0开始,查找u出现的位置,可以找到
    if((n=s1.find("Source",0))== string::npos)
        cout<<"2) "<<"Not Found" <<endl;
    else
        cout<<"2) "<<n<<","<<s1.substr(n)<<endl;
    //查找c,e,o中任何一个字母第一次出现的位置
    if((n=s1.find_first_of("ceo"))!= string::npos)
        cout<<"4) "<<n<<","<<s1.substr(n)<<endl;
    //查找c,e,o中任何一个字母最后一次出现的位置
    if((n=s1.find_last_of('e'))!= string::npos)
        cout<<"5) "<<n<<","<<s1.substr(n)<<endl;
    //查找非c,e,o中任何一个字母第一次出现的位置
    if((n=s1.find_first_not_of("ceo",1))!= string::npos)
        cout<<"4) "<<n<<","<<s1.substr(n)<<endl;

}

.replace()子串替换

void str_replace()
{
    string s1 ("Real steel");
    //用123456的位置2开始长度为4的子串替换s1从位置1开始长度为3的子串
    s1.replace(1,3,"123456",2,4);
    cout<<s1<<endl;

    string s2 ("Harry Potter");
    //用5个0替换s2从位置2开始长度为3的子串
    s2.replace(2,3,5,'0');
    cout<<s2<<endl;
    int n=s2.find("00000");  //如果把0写成O,那么返回-1,在无符号数中是一个很大的数
    s2.replace(n,5,"XXX");
    cout<<s2<<endl;
}

.erase()删除子串

void str_erase()
{
    string s1("Real Steel");
    s1.erase(1,3);  //删除子串(1,3),此后s1="R Steel"
    cout<<s1<<endl;
    s1.erase(5);  //删除位置下标5及其后面所有字符
    cout<<s1<<endl;
}

.insert()插入子串

void str_insert()
{
    string s1("Limitless");
    string s2("00");
    s1.insert(2,"123");  //在下标2前面插入子串
    cout<<s1<<endl;
    s1.insert(3,s2);  //在下标2前面插入子串
    cout<<s1<<endl;
    s1.insert(3,5,'X'); //在下标3处插入5个'X'
    cout<<s1<<endl;
}

串的深拷贝

//string
    string s;
    string s1("ssss");
//深拷贝,副本是新的空间;浅拷贝只是用一个新的指针指向同样的空间
    string s2(s1); //s2是s1的副本

    s1[0]='b';
    cout<<s1<<endl;
    cout<<s2<<endl;
    string s3=s2; //s3是s2的副本

set

//set
    set<int> ss;
    ss.insert(1);
    ss.insert(2);
    ss.insert(3);
    ss.insert(1);
    cout<<"size of s = "<<ss.size()<<endl;
    cout<<"maxsize of s = "<<ss.max_size()<<endl;  //位图的上限
    cout<<"first element of s = "<<*ss.begin()<<endl;
    cout<<"last element of s = "<<*ss.end()<<endl;  //C++11

map

//map 红黑树,增删查改十几单复杂度都是logn
    map<int,string> mapStudent;
    mapStudent.insert(pair<int,string>(1,"student_one"));
    mapStudent.insert(pair<int,string>(2,"student_two"));
    mapStudent.insert(pair<int,string>(3,"student_three"));
    mapStudent.insert(pair<int,string>(1,"student_three")); //相同的key值不能插入

    cout<<mapStudent.size()<<endl;

    for(map<int,string>::iterator it=mapStudent.begin(); it!=mapStudent.end(); it++)
        cout<<it->first<<" "<<it->second<<endl;
    map<int,string>::iterator iter;
    iter=mapStudent.find(1);
    cout<<iter->second<<endl;
    mapStudent.erase(iter);  //用迭代器删除

    int n=mapStudent.erase(1);  //用关键字1删除
    cout<<n;  //删除失败,因为已经用迭代器的方式删除了

    mapStudent.erase(mapStudent.begin(),mapStudent.end());//用迭代器成片删除

完整代码

#include<iostream>
#include<algorithm>
#include<stack>
#include<list>
#include<vector>
#include<string.h>
#include<set>
#include<map>

using namespace std;

//通过引用改变值
void modifynum(int & b)
{
    b++;
}
//通过引用改变指针
void modify_pointer(char * &p) //引用符号和变量名在一起
{
    p=(char*)malloc(20);
    strcpy(p,"hello");
}

void vec_insert()
{
    //创建一个vector,放置字母表前十个字母
    vector<char> alphaVector;
    for(int i=0; i<10; i++)
    {
        alphaVector.push_back(i+65);
    }

    //在第二个位置前插入4个C
    vector<char>::iterator i=alphaVector.begin();
    alphaVector.insert(i+1,4,'C');  //有些迭代器可以直接+1

    for(i=alphaVector.begin(); i!=alphaVector.end(); i++)
        cout<<*i;
    cout<<endl;

    sort(alphaVector.begin(),alphaVector.end());
    for(i=alphaVector.begin(); i!=alphaVector.end(); i++)
        cout<<*i;
    cout<<endl;
    cout<<endl;
}

void vec_del()
{
//创建一个vector,放置字母表前十个字母
    vector<char> alphaVector;
    for(int i=0; i<=10; i++)
    {
        alphaVector.push_back(i+65);
    }

    int size=alphaVector.size();

    vector<char>::iterator start;
    vector<char>::iterator temp;

    for(temp=alphaVector.begin(); temp!=alphaVector.end(); temp++)
        cout<<*temp;
    cout<<endl;

    for(int i=0; i<size; i++)
    {
        start=alphaVector.begin();
        alphaVector.erase(start);

        for(temp=alphaVector.begin(); temp!=alphaVector.end(); temp++)
            cout<<*temp;

        cout<<endl;

    }

}

void str_substr()
{
    string s="abcdefg";
    string s2=s.substr(1,5); //bcdef,返回pos1后面的n个字符组成的串
    cout<<s2<<endl;

    string s3=s.substr(4);  //efg,第二个默认参数为npos,结尾
    cout<<s3<<endl;
}

void str_find()
{
    string s1("Source Code");
    int n;
    //查找u出现的位置,没找到返回npos就是-1
    if((n=s1.find('u')) != string::npos)
        cout<<"1) "<<n<<","<<s1.substr(n)<<endl;  //下标从0开始,u第三个,所以u的下标是2
    //从pos1开始,查找u出现的位置,找不到
    if((n=s1.find("Source",1))== string::npos)
        cout<<"2) "<<"Not Found" <<endl;
    //从pos0开始,查找u出现的位置,可以找到
    if((n=s1.find("Source",0))== string::npos)
        cout<<"2) "<<"Not Found" <<endl;
    else
        cout<<"2) "<<n<<","<<s1.substr(n)<<endl;
    //查找c,e,o中任何一个字母第一次出现的位置
    if((n=s1.find_first_of("ceo"))!= string::npos)
        cout<<"4) "<<n<<","<<s1.substr(n)<<endl;
    //查找c,e,o中任何一个字母最后一次出现的位置
    if((n=s1.find_last_of('e'))!= string::npos)
        cout<<"5) "<<n<<","<<s1.substr(n)<<endl;
    //查找非c,e,o中任何一个字母第一次出现的位置
    if((n=s1.find_first_not_of("ceo",1))!= string::npos)
        cout<<"4) "<<n<<","<<s1.substr(n)<<endl;

}

void str_replace()
{
    string s1 ("Real steel");
    //用123456的位置2开始长度为4的子串替换s1从位置1开始长度为3的子串
    s1.replace(1,3,"123456",2,4);
    cout<<s1<<endl;

    string s2 ("Harry Potter");
    //用5个0替换s2从位置2开始长度为3的子串
    s2.replace(2,3,5,'0');
    cout<<s2<<endl;
    int n=s2.find("00000");  //如果把0写成O,那么返回-1,在无符号数中是一个很大的数
    s2.replace(n,5,"XXX");
    cout<<s2<<endl;
}

void str_erase()
{
    string s1("Real Steel");
    s1.erase(1,3);  //删除子串(1,3),此后s1="R Steel"
    cout<<s1<<endl;
    s1.erase(5);  //删除位置下标5及其后面所有字符
    cout<<s1<<endl;
}

void str_insert()
{
    string s1("Limitless");
    string s2("00");
    s1.insert(2,"123");  //在下标2前面插入子串
    cout<<s1<<endl;
    s1.insert(3,s2);  //在下标2前面插入子串
    cout<<s1<<endl;
    s1.insert(3,5,'X'); //在下标3处插入5个'X'
    cout<<s1<<endl;
}

int main()
{
    int b=10;
    char* p=NULL;
    modifynum(b);
    modify_pointer(p);
    //cout<<b<<endl;
//printf("%s",p);


//list<int> values{1,2,3}; //C++11支持
//stack<int,list<int>> my_stack(values);   //把list里的元素全部压到栈my_stack中
    
    //stack
    stack<int> my_stack;
    my_stack.push(1);
    my_stack.push(2);
    my_stack.push(3);

    cout<<"size of mystack: "<<my_stack.size()<<endl;
    while(!my_stack.empty())
    {
        cout<<my_stack.top()<<endl;
        my_stack.pop();
    }
    
//C语言实现动态数组:
//int* a=(int*)malloc(sizeof(int)*20);
//a=realloc(a,160);

//vector

    vector<int> vec;
    cout<<"vector size = "<<vec.size()<<endl;
    cout<<"vector capcity = "<<vec.capacity()<<endl;
//初始化vector
    for(int i=0; i<5; i++)
    {
        vec.push_back(i);
    }
    cout<<"extent vector size = "<<vec.size()<<endl;
    cout<<"extent vector capcity = "<<vec.capacity()<<endl;
//用下标访问vector
    for(int i=0; i<5; i++)
    {
        cout<<"value of vec ["<<i<<"] is "<<vec[i]<<endl;
    }

//用迭代器访问vector
//迭代器可以理解为光标,或者表盘上的露出日期的格子。
//当动态数组移动到了新的地址空间,指针只能指向原来的空间。但是用迭代器会自动改变指向的位置

    for(vector<int>::iterator v=vec.begin(); v!=vec.end(); v++)
    {
        cout<<*v<<endl;
    }

    vec.pop_back();  //删除最后一个元素
    cout<<"the size of vec after pop_back : "<<vec.size()<<endl;
    vec_insert();
    vec_del();

//list
    std::list<double> values;
    values.push_back(3.1);
    values.push_back(2.2);
    values.push_back(2.9);
    cout<<"values size: "<<values.size()<<endl;
    values.sort();

    for(std::list<double>::iterator it=values.begin(); it!=values.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

//在第一个元素后面插入5.6
    list<double>::iterator begin=values.begin();
    begin++;
    values.insert(begin,5.6);

    for(std::list<double>::iterator it=values.begin(); it!=values.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

//从尾部开始
    list<double>::iterator end=values.end();
    end--; //尾部是不能取到的
    values.erase(end);

    for(std::list<double>::iterator it=values.begin(); it!=values.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

//string
    string s;
    string s1("ssss");
//深拷贝,副本是新的空间;浅拷贝只是用一个新的指针指向同样的空间
    string s2(s1); //s2是s1的副本

    s1[0]='b';
    cout<<s1<<endl;
    cout<<s2<<endl;
    string s3=s2; //s3是s2的副本

    str_substr();
    str_find();
    str_replace();
    str_erase();
    str_insert();

//set
    set<int> ss;
    ss.insert(1);
    ss.insert(2);
    ss.insert(3);
    ss.insert(1);
    cout<<"size of s = "<<ss.size()<<endl;
    cout<<"maxsize of s = "<<ss.max_size()<<endl;  //位图的上限
    cout<<"first element of s = "<<*ss.begin()<<endl;
    cout<<"last element of s = "<<*ss.end()<<endl;  //C++11

//map 红黑树,增删查改十几单复杂度都是logn
    map<int,string> mapStudent;
    mapStudent.insert(pair<int,string>(1,"student_one"));
    mapStudent.insert(pair<int,string>(2,"student_two"));
    mapStudent.insert(pair<int,string>(3,"student_three"));
    mapStudent.insert(pair<int,string>(1,"student_three")); //相同的key值不能插入

    cout<<mapStudent.size()<<endl;

    for(map<int,string>::iterator it=mapStudent.begin(); it!=mapStudent.end(); it++)
        cout<<it->first<<" "<<it->second<<endl;
    map<int,string>::iterator iter;
    iter=mapStudent.find(1);
    cout<<iter->second<<endl;
    mapStudent.erase(iter);  //用迭代器删除

    int n=mapStudent.erase(1);  //用关键字1删除
    cout<<n;  //删除失败,因为已经用迭代器的方式删除了

    mapStudent.erase(mapStudent.begin(),mapStudent.end());//用迭代器成片删除
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WYF19999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值