正在加载……
专注、离线、切勿分心
STL为关联式容器提供了一些元素的查找与访问成员函数操作,以方便对元素的管理。

#include<iostream>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
class myString
{
        public:
                myString();
                myString(const myString&);
                myString(const char*);
     //后面用到sort排序算法,sort排序要对元素进行交换,防止浅拷贝重复释放,所以这里重写
     //没有这个就会报重复释放内存的错误
                myString& operator=(const myString&);
                ~myString();
        private:
                char* _pString;
                friend ostream& operator<<(ostream&,const myString&);
        //      friend bool operator>(const myString&,const myString&);
                friend bool operator<(const myString&,const myString&);
                friend bool operator==(const myString&,const myString&);
};
myString::myString()
{
        _pString = new char[1];
        _pString[0] = '\0';
}
myString::myString(const myString& rhs)
{
        _pString = new char[strlen(rhs._pString)+1];
        strcpy(_pString,rhs._pString);
}
myString::myString(const char* str)
{
        _pString = new char[strlen(str)+1];
        strcpy(_pString,str);
}
myString& myString::operator=(const myString& rhs)
{
        if(this!=&rhs)
        {
                delete _pString;
                _pString = new char[strlen(rhs._pString)+1];
                strcpy(_pString,rhs._pString);
        }
        return (*this);
}
myString::~myString()
{
        delete []_pString;
        _pString = NULL;
}

ostream& operator<<(ostream& os,const myString& rhs)
{
        os<<rhs._pString;
}
//bool operator>(const myString& lhs,const myString& rhs)
//{
//        return strcmp(lhs._pString,rhs._pString)>0;
//}
bool operator<(const myString& lhs,const myString& rhs)
{
        return strcmp(lhs._pString,rhs._pString)<0;
}
bool operator==(const myString& lhs,const myString& rhs)
{
        return strcmp(lhs._pString,rhs._pString)==0;
}
void  printObject(myString& rhs)
{
        cout<<rhs<<"  ";
}
int main()
{
        //1. vector和deque支持随机访问, 将本函数中的vector类型替换成deque类型后,结果一样
        //测试自定义数据类型MyString做为vector元素的用法
        vector<myString> obv;
        obv.push_back("A");
        obv.push_back("B");
        obv.push_back("C");
        obv.push_back(myString("A"));
        obv.push_back(myString("B"));
        obv.push_back(myString("C"));
        //调用 for_each()泛型算法来遍历vector容器的每个元素
        for_each(obv.begin(),obv.end(),printObject);
        cout<<endl;
        cout<<"vector sort:"<<endl;
        //调用泛型算法对vector容器元素进行排序
        //vector容器本身并没有提供sort排序算法
        //sort排序,就要对自定义类类型重载比较运算符
        sort(obv.begin(),obv.end());
        //sort只要重载<就可以了
        for_each(obv.begin(),obv.end(),printObject);
        cout<<endl;

        //find查找元素,返回一个迭代器,如果没找到,会返回obv.end()
        //find要用到==运算符,所以要在myString类里面重载==运算符
        cout<<"删除第一个B元素"<<endl;
        vector<myString>::iterator it = find(obv.begin(),obv.end(),myString("B"));
        if(it!=obv.end())
        {
                obv.erase(it);
        }
        for_each(obv.begin(),obv.end(),printObject);
        cout<<endl;

        cout<<"删除第一个C之后的所有元素"<<endl;
        vector<myString>::iterator it1 = find(obv.begin(),obv.end(),myString("C"));
        if(it!=obv.end())
        {
                obv.erase(it1,obv.end());
        }
        for_each(obv.begin(),obv.end(),printObject);
        cout<<endl;
        return 0;
}







posted on 2018-05-13 08:46  正在加载……  阅读(197)  评论(0编辑  收藏  举报