C++高阶之实战STL

该博客介绍了如何使用STL(标准模板库)在C++中对自定义类型(如Student)的容器进行排序,并通过重载'=='运算符删除冗余元素。首先创建并初始化Student对象,然后利用vector存储并排序这些对象。接着,通过重载'=='运算符确保比较逻辑,使用unique()算法找到重复项,最后用erase()删除冗余数据,实现容器内唯一性。
摘要由CSDN通过智能技术生成

STL实战程序

#include <vector>
#include <algorithm>
#include <string>
#include <iostream>

using namespace std;

class Student
{
    public:
        Student()
        {
            m_nHeight = 0;
            m_strName = "";
        };
        Student(string strName, int nHeight):m_strName(strName), m_nHeight(nHeight){};
    public:
        int GetHeight() const
        {
            return m_nHeight;
        }
        void Report() const
        {
            cout << "My name is : " << m_strName << " , my height is " << m_nHeight <<endl;
        }
    private:
        string m_strName = "";
        int m_nHeight = 0;
};

bool sortByHeight(const Student& st1, const Student& st2)
{
    return st1.GetHeight() < st2.GetHeight();
}

void CountOff(const Student& st)
{
    static int nNum = 0;
    ++nNum;
    cout<<nNum<<endl;
    st.Report();
}

int main()
{
    Student st1("changxinyuan", 175);
    Student st2("lining", 173);
    Student st3("jkt", 170);

    vector<Student> vecStu;
    vecStu.push_back(st1);
    vecStu.push_back(st2);
    vecStu.push_back(st3);

    Student st4("zhangsan", 160);
    Student st5("lisi", 165);
    Student st6("wanger", 168);

    vector<Student> vecStu2;
    vecStu2.push_back(st4);
    vecStu2.push_back(st5);
    vecStu2.push_back(st6);

    vecStu.resize(vecStu.size() + vecStu2.size());
    copy_backward(vecStu2.begin(), vecStu2.end(), vecStu.end());

    sort(vecStu.begin(), vecStu.end(), sortByHeight);

    for_each(vecStu.begin(), vecStu.end(), CountOff);

    return 0;
}

output:
1
My name is : zhangsan , my height is 160
2
My name is : lisi , my height is 165
3
My name is : wanger , my height is 168
4
My name is : jkt , my height is 170
5
My name is : lining , my height is 173
6
My name is : changxinyuan , my height is 175

删除容器中的冗余元素

排序

第一步,对容器中的所有数据进行排序。

unique()

第二步,也是最关键的一步,使用 unique()算法删除容器中的冗余元素。unique()算法会调用容器中数据相应类型的==操作符来判断两个数据元素是否相等,如果两个元素相等,就删除其中的一个元素,只在容器中保留其中的一个。因为这里容器中的数据是自定义的 Student 类型的对象,所以需要先重载这个类的==操作符,然后才能使用 unique()算法删除其中的冗余元素:

class Student
{
	// …
	public:
		// 重载“==”操作符,判断两个对象是否相同
		// 如果两个对象的姓名和身高属性都相同,则认为这两个对象相同
		bool operator == (const Student& st) const
		{
		// 使用“&&”保证两个条件同时成立
		return m_strName == st.GetName()
		&& m_nHeight == st.GetHeight();
		}
		// …
};
// 第二步:删除容器中的冗余元素
auto it = unique( vecStu.begin(),  vecStu.end());

erase()

第三步,使用 earse()算法彻底删除容器中的冗余元素。在第二步中,我们使用 unique()算法删除容器中的冗余元素,其实并没有真正意义上从容器中删除这些冗余数据,而只是将这些冗余数据挪动到了容器的末尾位置,同时它会返回一个指向容器中有效数据的结束位置的迭代器。通过从 begin()到这个迭代器范围,我们就可以访问到容器中没有冗余的所有数据。

// 第三步:删除容器末尾遗留的多余元素
vecStu.erase( it, vecStu.end() );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值