- 浏览: 373523 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
参考
http://blog.csdn.net/aastoneaa/article/details/8471722
http://blog.csdn.net/guang11cheng/article/details/7556697
http://blog.csdn.net/hzyong_c/article/details/7791415
强烈推荐文章
http://blog.csdn.net/bz201/article/details/543001
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求
必须要求:
另外:
你可在struct內加入 operator < ,就可以使struct有排序能力.因為而你的pcd struct內沒有指針,所以不須要有copy constructor和copy assignment, 編譯器會為你提供的, 你不須要自己做的.當你要排序時只要寫 sort( obj.begin(), obj.end() )就可.
下面是std::sort函数,有两个版本:
sort函数有以下特征:
1. 要求输入一个范围[first, last)
2. 随机迭代器,能用此算法的容器是支持随机访问的容器:vector, deque, string。
3.第一个版本使用operator<进行比较,默认升序排序,第二个版本使用comp做比较.
关于参数comp,comp带两个同类型的参数,如果第一个参数排在第二个参数前面,返回true,否则返回false
它可以是函数指针,也可以是函数对象。函数指针好理解,何谓函数对象?
函数对象(Function Object),是重载了operator()函数的类(或结构体)实例化出来的对象,使用起来像函数,又叫仿函数。
STL本身提供了几个比较函数,下面这些都是仿函数:
当容器元素为内建类型时可以使用,注意使用的格式,要加模版参数(由于是模板类)和后面的(),如下:
下面看看这3种方法的实现:
用函数对象代替函数指针的优点:
1. 函数对象可以存储中间结果在数据成员中,而函数想要存中间结果须要设全局变量或静态变量,这个是我们不想要的。
2. 在函数对象中编译器可以实现内联调用,从而提升性能。
下面看一个函数对象的扩展应用
C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?
对运算符号进行重载
全局的比较函数
函数对象
http://blog.csdn.net/aastoneaa/article/details/8471722
http://blog.csdn.net/guang11cheng/article/details/7556697
http://blog.csdn.net/hzyong_c/article/details/7791415
强烈推荐文章
http://blog.csdn.net/bz201/article/details/543001
如果要自己定义STL容器的元素类最好满足STL容器对元素的要求
必须要求:
引用
1、Copy构造函数
2、赋值=操作符
3、能够销毁对象的析构函数
2、赋值=操作符
3、能够销毁对象的析构函数
另外:
引用
1、可用的缺省构造函数,序列型容器必须,用于初始化元素
2、==操作符定义,用于判断相等
3、<操作符定义,关联型容器必须,用于缺省排序
2、==操作符定义,用于判断相等
3、<操作符定义,关联型容器必须,用于缺省排序
你可在struct內加入 operator < ,就可以使struct有排序能力.因為而你的pcd struct內沒有指針,所以不須要有copy constructor和copy assignment, 編譯器會為你提供的, 你不須要自己做的.當你要排序時只要寫 sort( obj.begin(), obj.end() )就可.
下面是std::sort函数,有两个版本:
template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, class Compare> void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
sort函数有以下特征:
1. 要求输入一个范围[first, last)
2. 随机迭代器,能用此算法的容器是支持随机访问的容器:vector, deque, string。
3.第一个版本使用operator<进行比较,默认升序排序,第二个版本使用comp做比较.
关于参数comp,comp带两个同类型的参数,如果第一个参数排在第二个参数前面,返回true,否则返回false
它可以是函数指针,也可以是函数对象。函数指针好理解,何谓函数对象?
函数对象(Function Object),是重载了operator()函数的类(或结构体)实例化出来的对象,使用起来像函数,又叫仿函数。
STL本身提供了几个比较函数,下面这些都是仿函数:
引用
less(小于)
greater(大于)
equal_to(等于)
not_equal_to(不相等)
less_equal(小于等于)
greater_equal(大于等于)
greater(大于)
equal_to(等于)
not_equal_to(不相等)
less_equal(小于等于)
greater_equal(大于等于)
当容器元素为内建类型时可以使用,注意使用的格式,要加模版参数(由于是模板类)和后面的(),如下:
sort(vec.begin(), vec.end(), less<int>());
下面看看这3种方法的实现:
// 排序元素,比较的对象 struct Person { Person(int id, const string& name, int age): id_(id), name_(name), age_(age) {} int id_; string name_; int age_; };
// 方式1:重载operator<用于排序时的比较(写在函数体内) bool operator< (const Person& rt) { return this->id_ < rt.id_; } // 排序函数写法,默认调用operator< sort(members.begin(), members.end());
// 方式2:写比较函数 bool CompAge(const Person& pl, const Person& pr) { return pl.age_ < pr.age_; } // 排序时传入比较函数指针 sort(members.begin(), members.end(), CompAge);
// 方式3:仿函数 struct CompName { bool operator()(const Person& pl, const Person& pr) { return pl.name_ < pr.name_; } }; // 排序时传入函数对象 sort(members.begin(), members.end(), CompName());
用函数对象代替函数指针的优点:
1. 函数对象可以存储中间结果在数据成员中,而函数想要存中间结果须要设全局变量或静态变量,这个是我们不想要的。
2. 在函数对象中编译器可以实现内联调用,从而提升性能。
下面看一个函数对象的扩展应用
// 利用函数对象实现升降排序 struct CompNameEx{ CompNameEx(bool asce) : asce_(asce) {} bool operator()(const Person& pl, const Person& pr) { return asce_ ? pl.name_ < pr.name_ : pr.name_ < pl.name_;<span style="white-space:pre"> </span>// 《Eff STL》条款21: 永远让比较函数对相等的值返回false } private: bool asce_; }; // 使用仿函数排序(升降序) sort(members.begin(), members.end(), CompNameEx(false));
C++中当 vector 中的数据类型为基本类型时我们调用std::sort函数很容易实现 vector中数据成员的升序和降序排序,然而当vector中的数据类型为自定义结构体类型时,我们该怎样实现升序与降序排列呢?
对运算符号进行重载
#include <vector> #include <algorithm> #include <functional> using namespace std; struct TItem { int m_i32Type; int m_i32ID; bool operator <(const TItem& rhs) const // 升序排序时必须写的函数 { return m_i32Type < rhs.m_i32Type; } bool operator >(const TItem& rhs) const // 降序排序时必须写的函数 { return m_i32Type > rhs.m_i32Type; } }; int main() { vector<TItem> stItemVec; TItem stItem1; stItem1.m_i32Type = 1; stItem1.m_i32ID = 1; TItem stItem2; stItem2.m_i32Type = 2; stItem2.m_i32ID = 2; TItem stItem3; stItem3.m_i32Type = 3; stItem3.m_i32ID = 3; TItem stItem4; stItem4.m_i32Type = 2; stItem4.m_i32ID = 4; stItemVec.push_back(stItem1); stItemVec.push_back(stItem2); stItemVec.push_back(stItem3); stItemVec.push_back(stItem4); // 升序排序 sort(stItemVec.begin(), stItemVec.end(), less<TItem>()); // 或者sort(ctn.begin(), ctn.end()); 默认情况为升序 for (size_t i = 0; i < stItemVec.size(); i++) printf("type: %d, id: %d\n", stItemVec[i].m_i32Type,stItemVec[i].m_i32ID); printf("--\n"); // 降序排序 sort(stItemVec.begin(), stItemVec.end(), greater<TItem>()); for (size_t i = 0; i < stItemVec.size(); i++) printf("type: %d, id: %d\n", stItemVec[i].m_i32Type,stItemVec[i].m_i32ID); return 0; }
全局的比较函数
#include <vector> #include <algorithm> #include <functional> using namespace std; struct TItem { int m_i32Type; int m_i32ID; }; bool lessmark(const TItem& stItem1, const TItem& stItem2) { return stItem1.m_i32Type < stItem2.m_i32Type; } bool greatermark(const TItem& stItem1, const TItem& stItem2) { return stItem1.m_i32Type > stItem2.m_i32Type; } int main() { vector<TItem> stItemVec; TItem stItem1; stItem1.m_i32Type = 1; stItem1.m_i32ID = 1; TItem stItem2; stItem2.m_i32Type = 2; stItem2.m_i32ID = 2; TItem stItem3; stItem3.m_i32Type = 3; stItem3.m_i32ID = 3; TItem stItem4; stItem4.m_i32Type = 2; stItem4.m_i32ID = 4; stItemVec.push_back(stItem1); stItemVec.push_back(stItem2); stItemVec.push_back(stItem3); stItemVec.push_back(stItem4); sort(stItemVec.begin(), stItemVec.end(), lessmark); //升序排序 for (size_t i = 0; i < stItemVec.size(); i++) printf("type: %d, id: %d\n", stItemVec[i].m_i32Type,stItemVec[i].m_i32ID); printf("--\n"); sort(stItemVec.begin(), stItemVec.end(), greatermark); //降序排序 for (size_t i = 0; i < stItemVec.size(); i++) printf("type: %d, id: %d\n", stItemVec[i].m_i32Type,stItemVec[i].m_i32ID); return 0; }
函数对象
#include <vector> #include <algorithm> #include <functional> using namespace std; struct TItem { int m_i32Type; int m_i32ID; }; class CompLess { public: bool operator ()(const TItem& stItem1, const TItem& stItem2) { return stItem1.m_i32Type < stItem2.m_i32Type; } }; class CompGreater { public: bool operator ()(const TItem& stItem1, const TItem& stItem2) { return stItem1.m_i32Type > stItem2.m_i32Type; } }; int main() { vector<TItem> stItemVec; TItem stItem1; stItem1.m_i32Type = 1; stItem1.m_i32ID = 1; TItem stItem2; stItem2.m_i32Type = 2; stItem2.m_i32ID = 2; TItem stItem3; stItem3.m_i32Type = 3; stItem3.m_i32ID = 3; TItem stItem4; stItem4.m_i32Type = 2; stItem4.m_i32ID = 4; stItemVec.push_back(stItem1); stItemVec.push_back(stItem2); stItemVec.push_back(stItem3); stItemVec.push_back(stItem4); sort(stItemVec.begin(), stItemVec.end(), CompLess()); //升序排序 for (size_t i = 0; i < stItemVec.size(); i++) printf("type: %d, id: %d\n", stItemVec[i].m_i32Type,stItemVec[i].m_i32ID); printf("--\n"); sort(stItemVec.begin(), stItemVec.end(), CompGreater()); //降序排序 for (size_t i = 0; i < stItemVec.size(); i++) printf("type: %d, id: %d\n", stItemVec[i].m_i32Type,stItemVec[i].m_i32ID); return 0; }
- 详细解说_STL_排序_Sort_.zip (59.6 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 253Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 417https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1346https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 481https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 580// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 593https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5828583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 609参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2177基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9161 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1596OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1886ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 879转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1926转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1095C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 974转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 1006转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 821参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1623转自 http://blog.csdn.net/weixinh ...
相关推荐
STL自定义排序准则 STL(Standard Template Library)是C++编程中非常重要的一部分,对于C++编程者来说, STL 的排序准则是一个非常重要的概念。今天,我们将讨论STL自定义排序准则的实现方法。 首先,我们来看...
使用结构体修改STL中的排序准则非常简单,只需要将结构体作为STL中的元素类型,并在结构体中定义自己的排序准则。 例如,我们可以使用结构体stu作为map的键类型,并按照name的长度进行排序。 map, int> stumap; ...
3. **自定义排序规则**:如果需要自定义排序规则(例如降序或根据特定属性排序),可以传递一个自定义的比较函数或函数对象作为第三个参数。例如,如果`vector`存储的是自定义类的对象,可以根据对象的某个成员变量...
若需要自定义排序规则,可以提供自己的比较函数或仿函数。例如,可以创建一个名为 compare 的函数: ```cpp bool compare(int a, int b) { return a > b; // 升序排序 } ``` 然后在调用 sort 时传入这个函数: `...
在这个详述STL排序的文章中,作者Winter ZT深入解析了STL中的排序功能,帮助开发者更好地理解和运用这些工具。 首先,前言部分强调了掌握STL的重要性,因为它是程序员避免重复实现基础算法的关键工具。STL几乎包含...
它将涵盖如何声明和实例化容器,如何使用迭代器遍历和修改元素,如何应用各种算法,以及如何自定义函数对象以满足特定需求。此外,手册可能还会包含示例代码和调试技巧,帮助开发者熟练掌握STL,并提高他们的编程...
STL中的排序算法与容器紧密结合,无论是在`vector`、`list`还是`deque`中,都可以直接应用排序操作。选择合适的排序函数取决于具体需求,如元素类型、序列大小以及对排序稳定性的要求。 #### 小结 STL提供的排序...
在实际编程中,通常我们会优先考虑使用STL提供的排序和查找功能,因为它们经过优化,效率高且易于使用。了解这些基本的排序和查找算法,不仅有助于理解STL的工作原理,也能在设计自定义算法时提供灵感。在3_1_Sort这...
在STL中,排序算法是经常被使用的工具,可以帮助我们对数据进行有效管理和分析。本文将详细解析STL中的排序算法及其相关知识点。 首先,STL提供了多种排序算法,满足不同的排序需求: 1. `sort`:这是最常用的排序...
在这个专题里,我们将深入探讨C++STL中的排序算法,主要关注如何使用它们以及背后的实现原理。 首先,C++STL中的排序算法主要有两个:`std::sort` 和 `std::stable_sort`。`std::sort` 是最常用的排序算法,它使用...
STL(Standard Template Library,标准模板库)是C++编程语言中的一个重要组成部分,它提供了高效且灵活的数据结构和算法。其中,map是一个关联容器,它按照键(key)的顺序来存储元素,每个键值对应一个唯一的数据...
在“stl.cpp”中,可能使用了sort算法对自定义结构的数组或容器进行排序。sort函数接受三个参数,分别是排序范围的起始和结束迭代器,以及一个可选的比较函数对象,用于确定元素的顺序。 4. 函数对象(仿函数):...
总的来说,`STL_Sort`是C++中实现排序的首选工具,它提供了丰富的功能,包括自定义比较和并行化处理,使得在各种场景下都能有效地组织数据。理解和熟练运用`sort`函数,能够显著提升C++编程的效率和代码质量。
本篇我们主要聚焦于STL中的排序算法,通过对相关源代码的深入理解和实践,来探讨其工作原理和应用场景。 1. **排序算法的种类** C++STL提供了多种排序算法,如`std::sort`,`std::stable_sort`,`std::partial_...
这个压缩包包含的代码示例涵盖了STL中的关键概念,如链表、容器、映射以及排序算法,非常适合学习和理解STL的使用。 1. **链表(List)** `list.cpp` 文件展示了STL中的`std::list`容器。`std::list`是一个双向...
C++ STL(Standard Template Library,标准模板库)是C++编程中的一个重要组成部分,它提供了一系列高效、可重用的数据结构和算法。STL的核心概念包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)...
在`ConsoleSTLSortTest`文件中,通常会包含上述各种示例的测试代码,包括不同数据类型的排序、自定义排序函数的实现以及可能的错误示例,帮助开发者更好地理解和运用`sort`函数。 通过了解这些知识点,开发者可以...