[C/C++标准库]_[初级]_[使用std::sort排序各种类型数据]

std::sort

场景:

1. 在使用sort排序时,有时候需要对对象的某个值进行排序,比如对类对象的某个id的int类型值或者bool类型值,其实bool类型值排序研究了半天。。

test_sort.cpp

#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

template <typename t>
void Print (vector<t> array)
{
	int size = array.size();
	cout << "size: " << size << endl;
	for (int i = 0; i < size; ++i)
	{
		cout << array[i] << endl;
	}
}

class Data
{
	friend ostream &operator<<(ostream &output, const Data* data);
public:
	Data(){}
	~Data(){}
	int id_;
	bool is_deleted_;

};

ostream& operator<<( ostream& os,const Data* data)
{
	return os << data->id_ << ":" << data->is_deleted_;
}

void SortString()
{
	vector<string> array;
	array.push_back("abc");
	array.push_back("a");
	array.push_back("bc");
	array.push_back("h");

	//1.从小到大排序
	cout << "sort with from small to big" << endl;
	sort(array.begin(),array.end(),std::less<string>());
	Print(array);

	//1.从大到小排序
	cout << "sort with from big to small" << endl;
	sort(array.begin(),array.end(),std::greater<string>());
	Print(array);

}

void SortInt()
{
	vector<int> array;
	array.push_back(4);
	array.push_back(5);
	array.push_back(1);
	array.push_back(2);

	//1.从小到大排序
	cout << "sort with from small to big" << endl;
	sort(array.begin(),array.end(),std::less<int>());
	Print(array);

	//1.从大到小排序
	cout << "sort with from big to small" << endl;
	sort(array.begin(),array.end(),std::greater<int>());
	Print(array);

}

bool CompId(Data* first,Data* second)
{
	return first->id_ < second->id_;
}

bool CompBool(Data* first,Data* second)
{
	return first->is_deleted_ > second->is_deleted_;
}

void SortData()
{
	vector<Data*> array;
	Data *d1 = new Data();
	d1->id_ = 4;
	d1->is_deleted_ = true;

	Data *d2 = new Data();
	d2->id_ = 3;
	d2->is_deleted_ = false;

	Data *d3 = new Data();
	d3->id_ = 1;
	d3->is_deleted_ = true;

	Data *d4 = new Data();
	d4->id_ = 5;
	d4->is_deleted_ = false;

	array.push_back(d1);
	array.push_back(d2);
	array.push_back(d3);
	array.push_back(d4);
	//1.根据id_从小到大排序.
	sort(array.begin(),array.end(),CompId);
	Print(array);

	//1.根据is_deleted_排序,true在前面.
	sort(array.begin(),array.end(),CompBool);
	Print(array);

}

int main(int argc, char const *argv[])
{
	cout << "begin" << endl;
	SortInt();
	SortString();
	SortData();
	return 0;
}

输出:

begin
sort with from small to big
size: 4
1
2
4
5
sort with from big to small
size: 4
5
4
2
1
sort with from small to big
size: 4
a
abc
bc
h
sort with from big to small
size: 4
h
bc
abc
a
size: 4
1:1
3:0
4:1
5:0
size: 4
1:1
4:1
3:0
5:0
时间: 2024-08-10 23:28:50

[C/C++标准库]_[初级]_[使用std::sort排序各种类型数据]的相关文章

[C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]

参考:1. http://en.cppreference.com/w/cpp/language/value_category   << Value categories >> 2. https://msdn.microsoft.com/en-us/library/dd293668.aspx   << Rvalue Reference Declarator: && >>3. https://msdn.microsoft.com/en-us/li

[C/C++标准库]_[初级]_[交集和补集]

场景: 1. 计算std::vector A和 std::vector B里的相同的元素, 用于保留不删除. 2. 计算std::vector A和 std::vector B里各自的补集, 用于删除A的补集和添加B的补集,用在一些更新关联表的操作里. 比如联系人A所属分组B是一个集合BV, 把联系人A的所属分组 修改为集合CV, 就需要删除两个集合BV,CV的CV补集和新增BV补集. 3. C++标准库为我们提供了这些算法. 代码: // test_AndroidAssistant.cpp :

[C/C++标准库]_[初级]_[使用ctype里的isxxx函数时要注意的事项]

场景: 1. 标准库里的 ctype.h里的函数是用于1个字节的判断的,但是参数却是int, 这样很容易导致误用. isalpha iscntrl isdigit isgraph isprint ispunct isspace isxdigit isalnum islower isupper int isspace( int ch ); 最恶心的是vc++的实现会对超过1字节的值会直接崩溃,gcc不会!!! #if defined (_DEBUG) extern "C" int __c

[C/C++标准库]_[初级]_[使用模板删除字符串前后空格((w)string space)]

场景: 1. C++没有提供删除std::(w)string的前后空格的函数,比如TrimSpace. 2. 很多库都提供, 但是为了移植代码方便,最好还是能用标准库解决就用标准库. 下边用模板实现了移除空格的函数. test.cpp #include <iostream> #include <stdlib.h> #include <string.h> #include <string> #include <ctype.h> using name

[zlib]_[初级]_[使用Zlib完整解压zip内容]

场景: 1. 解压文件一般用在下载了一个zip文件之后解压,或者分析某个文件需要解压的操作上. 2. 解压文件,特别是解压带文件夹的zip文件往往系统没有提供这类Win32 API,当然C#自带库能解压, 当然这里只讨论C/C++, 像C#和Java这种开挂的标准库不在考虑范围内. 3. zlib解压文件的使用例子在 contrib\minizip 例子里. 这里基本是直接提取miniunz.c 的代码进行封装解压即可, 只是改了下支持中文路径. 主文件 zip_util.cpp #includ

[C/C++标准库]_[初级]_[使用fstream合并文本文件]

场景: 1. 就是合并文本文件,并且从第2个文件起不要合并第一行. 2. 多加了一个功能,就是支持2个以上的文件合并. 3. 问题: http://ask.csdn.net/questions/192151 只能说很简单: 基础不过关吧,这位同学,也有可能不是开发的,放这里也是为了培训基础差的. test.cpp #include <fstream> #include <string> #include <iostream> using namespace std; /

[C/C++标准库]_[初级]_[过滤Windows文件名中的非法字符]

场景: 1. 通常生成文件时需要一个文件名,而生成文件名的方式可能是通过用户输入的字符,但是有些字符在windows上是不能作为文件名的,强行创建这类文件会失败. 2.一般可以通过正则表达式替换所有的非法字符,这里实现的是C++98 template(模板)方式的替换无效字符,std::string,std::wstring. 基本上windows上和字符串打交道都离不开wstring. 函数: template<class T> void FilterInvalidFileNameChar(

[C/C++标准库]_[初级]_[构造文件路径(stringByAppendingPathComponent)]

场景: 1. 很多情况下需要通过文件夹和文件名拼接文件路径字符串,每次都需要判断是否需要添加路径分隔符seperator很麻烦,所以可以写一个通用函数. 2. 大多数情况下都是windows使用wstring,mac使用string,所以用模版实现最通用. 函数: template<class T> T AppendPathComponent(const T& source,const T& component) { int length = source.length();

[C/C++标准库]_[初级]_[计算结构体成员的偏移量]

场景: 1. C结构体里计算结构体的偏移量平常看来没什么必要,但是放到插件结构的设计里就有必要了,比如只能使用偏移量访问的场景,而不能使用引用成员变量的场景. 2. 在设计一致性的接口时,公用的接口不怎么变化的,但是插件模块的结构可以不需要根据统一结构来设计,他们只需要提供偏移量给公用接口调用就行了,不同的插件 可能偏移量不一致,因为他们可以独立实现.公用接口就可以通过偏移量来访问不同的变量. 3. 可以使用stddef.h文件里的  offsetof /* Define offsetof ma