如果要自己定义STL容器的元素类最好满足STL容器对元素的要求
    必须要求:
     1、Copy构造函数
     2、赋值=操作符
     3、能够销毁对象的析构函数
    另外:
     1、可用的缺省构造函数,序列型容器必须,用于初始化元素
     2、==操作符定义,用于判断相等
     3、<操作符定义,关联型容器必须,用于缺省排序

你可在struct內加入 operator < ,就可以使struct有排序能力.
因為而你的pcd struct內沒有指針,所以不須要有copy constructor
和copy assignment, 編譯器會為你提供的, 你不須要自己做的.
當你要排序時只要寫 sort( obj.begin(), obj.end() )就可.

以上内容取自帖子:http://bbs.csdn.net/topics/40228627

另一篇参考地址:http://blog.csdn.net/tigernana/article/details/7293758

以下取自帖子:http://blog.csdn.net/guang11cheng/article/details/7556697

三种方式实现vector的自定义排序

方法1:重载运算符

 #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;
}

方法2:全局的比较函数

 #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;
}

方法3:函数对象

#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;
} /*
结果如下:
type: 1, id: 1
type: 2, id: 2
type: 2, id: 4
type: 3, id: 3
--
type: 3, id: 3
type: 2, id: 2
type: 2, id: 4
type: 1, id: 1
可以看出vector的sort的稳定的。
*/

问题:

1,示例代码中只有>和<关系处理,==关系是如何推导出来的?

2,排序时要移动元素,效率怎样?

3,如果自定义结构定义在一个类的内部,使用函数对象进行排序,这个函数对象可以作为类的成员函数吗?

4,在上面的例子中,vector中存放的都是结构(对象)本身,如果存放的是结构指针,该如何排序呢?此时只能通过全局的比较函数或者函数对象来做,且比较函数的参数要是指针类型的,如下:

(1)全局的比较函数

#include <vector>
#include <algorithm>
#include <functional> using namespace std; struct TItem
{
int m_i32Type;
int m_i32ID;
}; bool CompLess(const TItem* pstItem1, const TItem* pstItem2)
{
return pstItem1->m_i32Type < pstItem2->m_i32Type;
} bool CompGreater(const TItem* pstItem1, const TItem* pstItem2)
{
return pstItem1->m_i32Type > pstItem2->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;
}

  (2)函数对象

#include <vector>
#include <algorithm>
#include <functional> using namespace std; struct TItem
{
int m_i32Type;
int m_i32ID;
}; class CompLess
{
public:
bool operator ()(const TItem* pstItem1, const TItem* pstItem2)
{
return pstItem1->m_i32Type < pstItem2->m_i32Type;
}
}; class CompGreater
{
public:
bool operator ()(const TItem* pstItem1, const TItem* pstItem2)
{
return pstItem1->m_i32Type > pstItem2->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;
}

  

【转】c++中Vector等STL容器的自定义排序的更多相关文章

  1. C++中vector,set,map自定义排序

    一.vector排序 vector支持cmp,就类似数组,可以直接sort. #include <iostream> #include <algorithm> #include ...

  2. C++ STL中vector(向量容器)使用简单介绍

    原文:http://www.seacha.com/article.php/knowledge/cbase/2013/0903/2205.html C++ vector(向量容器)是一个线性顺序结构.相 ...

  3. STL容器——对map排序

    STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入 ...

  4. STL容器set()--->自定义数据类型

    set容器中不能插入重复的元素,需要其插入的元素有比较大小(<).相等(==) 的逻辑判断,这是因为set中的元素是有序排列, 默认从小到大排列 std::set<type,std::le ...

  5. C/C++知识要点2——STL中Vector、Map、Set容器的实现原理

    1.Vector是顺序容器.是一个动态数组.支持随机存取.插入.删除.查找等操作,在内存中是一块连续的空间.在原有空间不够情况下自己主动分配空间.添加为原来的两倍.vector随机存取效率高,可是在v ...

  6. [转贴]从零开始学C++之STL(二):实现一个简单容器模板类Vec(模仿VC6.0 中 vector 的实现、vector 的容量capacity 增长问题)

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:  C++ Code  1 2   template < class _Ty, cl ...

  7. C++中 vector(容器)的用法

    vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: ...

  8. c++中vector等容器的实现机制

    stl容器区别: vector list deque set map-底层实现 stl容器区别: vector list deque set map (转) 在STL中基本容器有: vector.li ...

  9. 不要在公共接口中传递STL容器

    最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...

随机推荐

  1. jQuery+Superfish制作下拉菜单

    superfish制作下拉菜单真的很方便而好很好用,而且还可以通过Superfish提供的参数来控制下拉菜单的不同效果,而且他没有层级限制,换句话说可以通过Superfish来写你想要的层级菜单. 官 ...

  2. 解决 Tomcat 无法绑定 80 端口的问题,以及 Tomcat 配置虚拟目录、二级域名等

    问题 今天安装完 Tomcat,安装时把 Tomcat 默认的 HTTP/1.1 Connector Port 从 8080 改为了 7080,启动 Tomcat,在浏览器中输入 Http://loc ...

  3. C++ Web Service SDK

    https://github.com/zaphoyd/websocketpp https://github.com/aws/aws-sdk-cpp

  4. BEA-150021 - The admin server failed to authenticate the identity of the user username starting the managed server.

    原因:用户名.密码错误. 解决方法:修改boot.properties用户名密码为明文方式,然后重新启动就OK了,自动加密.

  5. Cocos2d-x SpriteFrameCache的使用

    根据官方文档与其他c++属性实现的类似书中示例: 图中的小人是会动的. 首先使用texturepacker制作出一张拼图,导出plist等文件: plist类似: 3.x的cocos似乎不再鼓励使用什 ...

  6. 叨叨PS那些活

    临睡前记得今天技术小结没写...就起来叨叨些使用Photoshop做网站的活吧. 一般网站的建站流程和人员配置是: 1 美工,创建页面的psd图 2 前端工程师,根据psd图,切出html页面 3 后 ...

  7. SQL SERVER2008及以上版本数据库自动备份的三种方法

    方法一:创建一个维护计划对数据库进行备份 方法二:创建一个SQL作业对数据库进行备份 方法三:创建WINDOWS任务计划对数据库进行备份 方法一与方法二其实原理基本相同,都必需开启SQL代理服务,都会 ...

  8. Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  9. 第一个sprint总结和读后感

    总结:通过第一个sprint的冲刺,了解了sprint的整个流程,学会了在一个团队里该如何开展一个项目和分配任务.我们的队团在第一个sprint中没有达到我们预期的效果,我们也做出了反省,原因一是我们 ...

  10. 极简Unity调用Android方法

    简介 之前写了篇unity和Android交互的教程,由于代码里面有些公司的代码,导致很多网友看不懂,并且确实有点小复杂,这里弄一个极简的版本 步骤 废话不多说,直接来步骤吧 1.创建工程,弄大概像这 ...