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() );