c++中STL容器中的排序

1.c++STL中只有list自带了排序函数:

(1).若list中存放的是int类型或者string类型,直接利用sort即可:

list <int> list1;

list1.sort();

此时默认为升序,若要使用降序,直接自定义cmp函数即可。

(2).若存放的是结构体或其他指针类型,需要自己定义比较结构体:

struct student

{

int num;
};

struct node

{

bool operator()(student a,student b)

return a.num>b.num;//从大到小排序
};

list<student> list1;

list1.sort(node());

2.vector排序:

使用algorithm中的sort函数:

#include<iostream>

#include<vector>

#include<algorithm>

using namespace std;

int cmp(int a,int b){

return a > b;//按降序排序

}

int main(){

vector<int> vec;

vec.push_back(324);

vec.push_back(344);

vec.push_back(2134);

vec.push_back(23);

vec.push_back(12);

vec.push_back(134);

vec.push_back(987);

sort(vec.begin(),vec.end(),cmp);

vector<int>::iterator it;

for(it = vec.begin();it != vec.end();it++)

cout<<*it<<" ";

cout<<endl;

return 0;

}

3.STL中的set排序:其中set本身是自带排序的,默认按升序进行排序:

#include <iostream>

#include <set>

using namespace std;

int main()

{

set <int,less<int> > set1;//若使用less,则从小到大,若使用greater则从大到小。

set1.insert(20);

set1.insert(15);

set1.insert(0);

set1.insert(80);

set<int>::iterator cset=set1.begin();

while(cset!=set1.end())

{

cout<<*cset<<" ";

cset++;

}

int m;

cin>>m;

return 0;

}

若定义set中存储的为结构体:

#include <iostream>

#include <string>

#include <set>

using namespace std;

struct intComp {

bool operator() (const int& lhs, const int& rhs) const{

return lhs > rhs;

}

};

struct strComp

{

bool operator() (const string& str1, const string& str2) const {

return str1.length() < str2.length();

}

};

int main() {

int a[] = {10, 20, 30, 40, 50};

set<int, intComp> s1(a, a + 5);

for (auto it = s1.cbegin(); it != s1.cend(); it++)

{

cout << *it << " ";

}

cout << endl;

string b[] = {"apple", "banana", "pear", "orange", "strawberry"};

set<string, strComp > s2(b, b + 5);

for (auto it = s2.cbegin(); it != s2.cend(); it++)

{

cout << *it << " ";

}

cout << endl;

system("pause");

return 0;

}

4.STL中map:

由于在map中是由红黑树实现的所以自带生序排序(key)

#include <iostream>

#include <map>

#include <string>

using namespace std;

int main()

{

map <int,string,less<int> > map1;//使用less有小到大 greater由大到小

map1[1]="HZ";

map1[8]="yu";

map1[100]="rue";

map1[-10]="23";

map<int,string>::iterator cmap=map1.begin();

while(cmap!=map1.end())

{

cout<<cmap->first<<" ";

cmap++;

}

int m;

cin>>m;

return 0;

}

若存储的是结构体:

#include <iostream>

#include <map>

using namespace std;

struct student

{

int num;

};

bool operator <(student a,student b)

{

return a.num>b.num;//由大到小

}

int main()

{

map<student,int> map1;

student a;

a.num=100;

map1[a]=10;

student b;

b.num=1000;

map1[b]=11;

student c;

c.num=0;

map1[c]=102;

map<student,int> ::iterator st=map1.begin();

while(st!=map1.end())

{

cout<<(st->first).num<<" ";

st++;

}

int m;

cin>>m;

return 0;

}

map:(value)

#include <map>

#include <vector>

#include <algorithm>

#include <iostream>

using namespace std;

struct CmpByValue {

bool operator()(const pair<string,int> & lhs, const pair<string,int> & rhs)

{return lhs.second > rhs.second;}

};

void substrcount(string str)

{

map<string,int> substr;

string subs;

for(int i =1; i<str.size();i++)

for(int j =0; j<=str.size()-i;j++)

{

subs = str.substr(j,i);

if(substr.find(subs)==substr.end())

substr[subs] = 1;

else

substr[subs] = substr[subs]+1;

}

vector<pair<string,int>> counts(substr.begin(),substr.end());

sort(counts.begin(),counts.end(),CmpByValue());

cout<<(counts.begin()->first)<<endl;

cout<<counts.begin()->second<<endl;

}

原文地址:https://www.cnblogs.com/yan1/p/10582684.html

时间: 2024-11-10 14:38:15

c++中STL容器中的排序的相关文章

如何选择STL容器中对象的删除方法

备注:唯一从容器中除去一个元素的方法是在那个容器上调用一个成员函数. 以下介绍删除不同类型的容器中满足某种条件的值的方法,某种条件指的是 bool badValue(int value)返回true的情况. 1.序列容器 for(SeqContainer<int>::iterator i = c.begin(); i != c.end(); /*nothing*/) { if(badValue(*i)) { //something to do i = c.erase(i); } else ++

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam

C++中STL容器类型做函数不使用引用导致程序效率下降

最近刷算法题,发现一个问题: 我是用递归实现一个算法,但在函数TreeNode * createTree(vector<int> &num, int left, int right) 一开始使用了TreeNode * createTree(vector<int> num, int left, int right),结果总是超时, 在网上找了一些别人写的算法,发现都是那样实现的,最后发现了是函数的参数类型不同, 别人使用vector类型做参数时,传递的是引用,而我直接使用了函

STL容器中的erase函数调用问题

自我感觉,erase函数返回一个迭代器,指向被删除元素的下一个位置,不是很合理. 啥也不说,直接上代码: int findNum = 2;    int array[] = { 1, 2, 2, 4, 5, 6 };    vector<int> ivec(array, array + sizeof(array) / sizeof(*array));    for (vector<int>::iterator iter = ivec.begin(); i != ivec.end()

stl容器中的 .front()函数隐士转换

周末,睡了两个好觉.前天把周任务完成了,在看公司项目源码.发现std::map 的.front函数会发生隐士转换. 伪代码如下: std::map<int,int> m_map; int &i = m_map.front(): // .fornt 函数书上写的是返回一个引用. m_map.pop_push(); //弹出第一个 映射 return i; //当时就郁闷了,这样做不会出错吗? //仔细看是这样的 int i = m_map.front(); //这里转换了,当时蒙蒙冲的,

自定义String类,并且实现在STL容器中添加自定义的类型

13.44 编写标准库string类的简化版本,命名String.你的类应该至少有一个默认构造函数和一个接受C风格字符串指针参数的构造函数.使用allocator为你的String类分配所需内存. 13.47 添加拷贝构造函数和拷贝赋值运算符,并添加打印语句,则每次函数执行时打印一条信息. 13.48 定义一个vector<String>并在其上多次调用push_back.运行程序,观察String被拷贝了多少次. #include<iostream> #include<st

ios 中在容器中移除单个控件的两个方法Subview

我们知道[parentView removeFromSuperView];  会把全部的view都移除.以下我们可以通过给subView设一个tag,然后遍历所有的subView,找到目标subView再删除. ? 1 2 3 4 5 for (UIView *subviews in [self.view subviews]) {         if (subviews.tag==22) {             [subviews removeFromSuperview];        

隔离 docker 容器中的用户

笔者在前文<理解 docker 容器中的 uid 和 gid>介绍了 docker 容器中的用户与宿主机上用户的关系,得出的结论是:docker 默认没有隔离宿主机用户和容器中的用户.如果你已经了解了 Linux 的 user namespace 技术(参考<Linux Namespace : User>),那么自然会问:docker 为什么不利用 Linux user namespace 实现用户的隔离呢?事实上,docker 已经实现了相关的功能,只是默认没有启用而已.笔者将在

STL - STL容器的适用情况

原文地址:http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ 一.各种容器的特性 vector 典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取.修改具有常数时间复杂度,在序列尾部进行插入.删除是常数时间复杂度,但在序列的头部插入.删除的时间复杂度是O(n),可以 在任何位置插入新元素,有随机访问功能,插入删除操作需要考虑. deque 序列容器,