C++分析——特殊容器STL使用
排序容器sort
- 使用默认排序比较
- 使用自定义比较器比较
- 乱序容器random_shuffle
排序容器sort
排序容器sort,将数组的元素从大到小或从小到达排序;
乱序容器random_shuffle,将数组的元素的顺序随机打乱,需要配合随机因子。
头文件:#include
使用默认排序比较
std::vector<int> Value;
Value.push_back(1);
Value.push_back(3);
Value.push_back(5);
Value.push_back(7);
Value.push_back(9);
Value.push_back(6);
Value.push_back(9);
Value.push_back(2);
Value.push_back(4);
//默认从小到大排序
std::sort(Value.begin(), Value.end());
Show_info(Value);
cout << "Next " << endl;
//加入比较器,比较类型为int值,从大到小排序
std::sort(Value.begin(), Value.end(),std::greater<int>());
Show_info(Value);
执行结果
$ ./project.o
CSystem is called.
int vertor info is 1
int vertor info is 2
int vertor info is 3
int vertor info is 4
int vertor info is 5
int vertor info is 6
int vertor info is 7
int vertor info is 9
int vertor info is 9
Next
int vertor info is 9
int vertor info is 9
int vertor info is 7
int vertor info is 6
int vertor info is 5
int vertor info is 4
int vertor info is 3
int vertor info is 2
int vertor info is 1
使用自定义比较器比较
通常,比较的类型不仅仅是值层面的比较,还需要类的比较,比较后将他们重新排序。这时候需定义类的比较器,并重载“<”和“>”号。
定义一个类,类成员函数有ID值和数值
class CInfo
{
public:
CInfo():index(0),m_number(0){}
CInfo(int index_value,int number_value):index(index_value),m_number(number_value){}
~CInfo(){index = 0;m_number = 0;}
void set_index(int value){ index = value;}
int get_index(){
return index;}
void set_number(int value){ m_number = value;}
int get_number(){
return m_number;}
//定义比较器比较大的值
static bool Cmp(CInfo &origin_value,CInfo &cmp_calue)
{
return origin_value > cmp_calue;
}
//重载<
bool operator<(CInfo &value)
{
return this->m_number < value.m_number;
}
//重载>
bool operator>(CInfo &value)
{
return this->m_number > value.m_number;
}
//重载os输出 <<
friend std::ostream& operator<< (std::ostream &os,CInfo &out)
{
os<< "Info index is " << out.index << " number is "<< out.m_number <<std::endl;
return os;
}
//重载os输出 <<
friend std::ostream& operator<<(std::ostream &os,std::vector<CInfo> &out)
{
std::vector<CInfo>::iterator iter = out.begin();
while(iter != out.end())
{
os << *iter;
iter++;
}
return os;
}
private:
int index;
int m_number;
};
以及定义这个类的容器
std::vector Class_Value;
容器里面的值是在不同时期加进去的,里面顺序数值随机,此时需要根据类中成员变量m_number的值,对这个类的容器里面的值进行从大到小或从小到大排序。
测试源码:
srand((unsigned)time(NULL));
std::vector<CInfo> Class_Value;
for(int i = 0;i < 10;i++)
{
//生成随机数
CInfo info(rand()%10, rand()%100);
Class_Value.push_back(info);
}
cout << Class_Value << endl;
cout << "Sorting after ... " << endl;
std::sort(Class_Value.begin(), Class_Value.end(),CInfo::Cmp);
cout << Class_Value << endl;
执行结果
$ ./project.o
CSystem is called.
Info index is 9 number is 56
Info index is 6 number is 14
Info index is 3 number is 97
Info index is 8 number is 97
Info index is 8 number is 67
Info index is 5 number is 87
Info index is 5 number is 51
Info index is 7 number is 64
Info index is 8 number is 67
Info index is 3 number is 92
"Sorting after ...
Info index is 3 number is 97
Info index is 8 number is 97
Info index is 3 number is 92
Info index is 5 number is 87
Info index is 8 number is 67
Info index is 8 number is 67
Info index is 7 number is 64
Info index is 9 number is 56
Info index is 5 number is 51
Info index is 6 number is 14
乱序容器random_shuffle
乱序容器是将容器内的成员随机打乱顺序,顺序的随机程度由随机种子决定。
头文件:#include
测试源码:
//依据时间生成随机种子
srand((unsigned)time(NULL));
std::vector<int> Class_Value;
for (int i = 0; i < 10; i++)
{
Class_Value.push_back(i);
}
cout << "random shuffle after ... " << endl;
random_shuffle(Class_Value.begin(), Class_Value.end());
std::vector<int>::iterator iter = Class_Value.begin();
while (iter != Class_Value.end())
{
cout << "vector number is " << *iter << endl;
iter++;
}
执行结果
$ ./project.o
CSystem is called.
random shuffle after ...
vector number is 8
vector number is 4
vector number is 6
vector number is 2
vector number is 5
vector number is 9
vector number is 3
vector number is 7
vector number is 0
vector number is 1
还没有评论,来说两句吧...