欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++STL复习

程序员文章站 2022-05-18 15:07:09
c++stl复习 #include #include #include #include using namespace std; void printvector(int val...
c++stl复习
#include
#include
#include
#include
using namespace std;

void printvector(int val)
{
    cout << val << " ";
}

void test1()
{
    vectorv;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    //每一个容器都有自己的迭代器, 迭代器用于遍历容器
    //v.begin 返回一个迭代器 指向容器的第一个元素
    //v.end()返回一个迭代器,指向容器的最后一个元素的下一个位置
    //vector::iterator pbegin = v.begin();可以这样写 根据c++11新特性 可以用下面的写法:
    auto pbegin = v.begin();
    auto pend = v.end();
    //遍历
    while (pbegin != pend)
    {
        cout << *pbegin << endl;
        pbegin++;
    }
    printf("----------\n");
    for (auto it = v.begin(); it != v.end(); it++)
    {
        cout << *it << endl;
    }
    //for_each函数循环将容器中的元素传递给函数对象, 通过函数对象的operator()的具体实现来执行相应操作
    for_each(v.begin(), v.end(), printvector);
}

//容器存放自定义的数据类型
class person
{
    //public可以被类外成员访问
    //private可以被类成员访问和友元访问不能被类外成员访问
    //protected可以被子类对象访问 不能在类外访问
public:
    person(string name, int age)
    {
        mname = name;
        mage = age;
    }
public:
    string mname;
    int mage;
};
//容器存放指针
void test2()
{
    vectorvp;
    person p1("aaaa", 20);
    person p2("bbbb", 30);
    person p3("cccc", 40);
    person p4("dddd", 50);
    person p5("eeee", 60);
    person p6("ffff", 70);
    person p7("aaaa", 20);

    //添加元素
    vp.push_back(p1);
    vp.push_back(p2);
    vp.push_back(p3);
    vp.push_back(p4);
    vp.push_back(p5);
    vp.push_back(p6);
    vp.push_back(p7);

    //遍历
    for (auto it = vp.begin(); it != vp.end(); it++)
    {
        cout << "name = " << (*it).mname << " age = " << (*it).mage << endl;
    }
}

//容器存放容器
void test3()
{
    vectorv1;
    vectorv2;
    vectorv3;
    vectorv4;

    for (int i = 0; i < 4; i++)
    {
        v1.push_back(1 + i);
        v1.push_back(2 + i);
        v1.push_back(3 + i);
        v1.push_back(4 + i);
    }
    vector>v;
    v.push_back(v1);
    v.push_back(v2);
    v.push_back(v3);
    v.push_back(v4);
    //遍历
    for (auto it = v.begin(); it != v.end(); it++)
    {
        for (auto vit = (*it).begin(); vit != (*it).end(); vit++)
        {
            cout << *vit << " ";
        }
        cout << endl;
    }
}

void test4()
{
    string s1;//创建空字符串,调用无参构造函数
    string s2(s1);//拷贝构造
    const char *str = "hello";
    string s4(str);
    string s5(10, 'a');
    cout << s4 << endl;
    cout << s5 << endl;
}

//2 赋值操作
/*
string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串s赋给当前的字符串
string& operator=(char c);//字符赋值给当前的字符串
string& assign(const char *s);//把字符串s赋给当前的字符串
string& assign(const char *s, int n);//把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s);//把字符串s赋给当前字符串
string& assign(int n, char c);//用n个字符c赋给当前字符串
string& assign(const string &s, int start, int n);//将s从start开始n个字符赋值给字符串*/

void test5()
{
    string s1;
    string s2 = "aaaa";
    s1 = "afddra";
    s1 = s2;
    s1 = 'a';

    string s3;
    s3.assign("binsbca");
    string s4;
    s4.assign(s3, 2, 3);
    cout << s1 << endl;
    cout << s2 << endl;
    cout << s3 << endl;
    cout << s4 << endl;
}

//3 存取操作
/*
char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过at方法获取字符
*/
void test6()
{
    string s = "hello world";
    for (int i = 0; i < s.size(); i++)
    {
        cout << s[i] << " ";
    }
    cout << endl;

    for (int i = 0; i < s.size(); i++)
    {
        cout << s.at(i) << " ";
    }
    cout << endl;

    //[] 和 at 访问越界,[] 直接抱错, at 抛出异常out_of_range
    try
    {
        //cout << s[100] << endl;
        cout << s.at(100) << endl;
    }
    catch (...)
    {
        cout << "异常" << endl;
    }
}

//4 拼接操作
/*
string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string& append(int n, char c);//在当前字符串结尾添加n个字符c
*/

void test7()
{
    string s1 = "hello";
    string s2 = "world";
    s1 += s2;
    cout << s1 << endl;

    string s3;
    s3 = s1 + s2;
    cout << "s3 = " << s3 << endl;

    string s4;
    s4 += "ssss";
    cout << "s4 = " << s4 << endl;

    string s5 = "shenzhen";
    s5.append(s1);
    cout << "s5 = " << s5;
}

//5 查找和替换
/*
int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
int find(const char* s, int pos = 0) const;  //查找s第一次出现位置,从pos开始查找
int find(const char* s, int pos, int n) const;  //从pos位置查找s的前n个字符第一次位置
int find(const char c, int pos = 0) const;  //查找字符c第一次出现位置
int rfind(const string& str, int pos = npos) const;//查找str最后一次位置,从pos开始查找
int rfind(const char* s, int pos = npos) const;//查找s最后一次出现位置,从pos开始查找
int rfind(const char* s, int pos, int n) const;//从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
string& replace(int pos, int n, const char* s); //替换从pos开始的n个字符为字符串s
*/
void test8()
{
    string s1 = "shenzhen001";
    int pos = s1.find("001", 2);
    cout << pos << endl;
    const char *str = "abin002";
    s1.replace(3, 6, str);
    cout << s1 << endl;
}

//6 比较
/*
compare函数在>时返回 1,<时返回 -1,==时返回 0。
比较区分大小写,比较时参考字典顺序,排越前面的越小。
大写的a比小写的a小。

int compare(const string &s) const;//与字符串s比较
int compare(const char *s) const;//与字符串s比较
*/
void test9()
{
    string s1 = "hello";
    string s2 = "hello";
    const char *str = "aaa";
    string s3 = "aaa";
    int ret = s1.compare(s2);
    cout << ret << endl;

    ret = s1.compare(str);
    cout << ret << endl;
    ret = s3.compare(s1);
    cout << ret << endl;
}
//7 子串
/*
string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串
*/
void test10()
{
    string s = "usrname@abin.com";
    int pos = s.find("@");
    string name = s.substr(0, pos);
    cout << name << endl;
}

//8 插入和删除
/*
string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n个字符c
string& erase(int pos, int n = npos);//删除从pos开始的n个字符
*/
void test11()
{
    string s1 = "hello";
    const char *str = "123";
    cout << s1.insert(2, str) << endl;
    cout << s1.erase(2, 3) << endl;
}

//9 字符串转换
/*
//string 转 char*
string str = "itcast";
const char* cstr = str.c_str();
//char* 转 string
char* s = "itcast";
string sstr(s);
*/

void change(const char *a)
{
    return;
}

void test12()
{
    //c_string---->string
    const char *str = "hell12o";
    string s(str);
    cout << s << endl;

    //string---->c_string
    string s1 = "world";
    const char *str2 = s1.c_str();
    cout << str2 << endl;
}
void test13()
{
    string s = "asbcdsfsa";
    char &a = s[2];
    char &b = s[3];
    a = '1';
    b = '0';
    cout << s << endl;
    cout << (int *)s.c_str() << endl;
}
void test14()
{
    string s = "a";
    int *p = null;
    int size = 0;
    for (int i = 0; i < 100; i++)
    {
        s.append("a");
        if ((int *)s.c_str() != p)
        {
            p = (int *)s.c_str();
            cout << s.size() << endl;
            cout << s.length() << endl;
        }
    }
}
//1 初始化
/*
vector v; //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷贝构造函数。
*/

void printv(vector&v)
{
    for (auto it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

void test01()
{
    vectorv1;
    int arr[] = { 1,2,3,4,5 };
    vectorv2(arr, arr + sizeof(arr) / sizeof(int));
    vectorv3(10, 10);
    vectorv4(v2);
    printv(v2);
    printv(v3);
    printv(v4);
}
//2 赋值
/*
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
vector& operator=(const vector  &vec);//重载等号操作符
swap(vec);// 将vec与本身的元素互换。
*/
void test02()
{
    int arr[] = { 1,2,3,4,5 };
    vector v1(arr, arr+sizeof(arr) / sizeof(int));
    vectorv2;
    v2.assign(v1.begin(), v1.end());
    printv(v1);
    printv(v2);

    int arr1[] = {10,9,8,7,5 };
    vectorv3(arr1, arr1 + sizeof(arr) / sizeof(int));
    printv(v3);
    cout << "交换后" << endl;
    v1.swap(v3);
    printv(v1);
    printv(v3);
}

//3 大小操作
/*
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
*/
void test03()
{
    int arr[] = { 1,2,3,4,5 };
    vectorv1(arr, arr + sizeof(arr) / sizeof(int));
    if (v1.empty())
    {
        cout << "空" << endl;
    }
    else
    {
        cout << "size : " << v1.size() << endl;
    }
    printv(v1);
    v1.resize(10);
    printv(v1);
    v1.resize(20, 1);
    printv(v1);
    cout <<"size :"<< v1.size() << endl;
    cout << "capacity():" << v1.capacity() << endl;
}
int main()
{
    //test1();
    //test2();
    //test3();
    printf("---下面是string---:\n");
    //test4();
    //test5();
    //test6();
    //test7();
    //test8();
    //test9();
    //test10();
    //test11();
    //test12();
    //test13();
    //test14();
    printf("---vertor:\n");
    //test01();
    //test02();
    test03();
    return 0;
}

待续