C++ STL中的自定义排序和vector

优先队列priority_queue

优先队列一般写法

//队列头部值最大,大顶堆
priority_queue<int, vector<int>, greater<> >pq;
//小大顶堆
priority_queue<int, vector<int>, less<> >pq;

自定义排序规则

自定义()运算符,传入两个参数,内部写> 实际上是从小到大排序与sort相反!
写法一:

struct node
{
    int to,cost;
};
struct cmp
{
    bool operator() (const node &a,const node &b)
    {
        return a.cost > b.cost;
    }
};
priority_queue<node,vector<node>,cmp>priq;

写法二:

struct node
{
    int to,cost;
    node(int x1,int x2)
    {
        to=x1;
        cost = x2;
    }
    friend bool operator<(const node &a , const node &b)
    {
        return a.cost>b.cost;   // ascending sort
    }

};
priority_queue<node>priq;

优先队列的包装函数多,一般是empty(),size(),pop(),top(),push()

set和multiset

以下介绍set,multiset用法类似
一般写法

set<int>se

自定义排序

struct mynode {
    int end, id;
};
struct  rules
{
    bool operator()(const mynode& a, const mynode& b)
    {
        return a.end < b.end;
    }
};
set<mynode,rules> se;

set可以通过迭代器支持头部删除和尾部删除(也就是一种支持可以删除最值和动态更新的容器)
当然通过迭代器可以删除任意位置的元素

//一些用法
se.erase(mset.begin());//删除第一个
mset.erase(--mset.end());//删除最后一个
vec.push_back((*(--mset.end())).id);//取出最后一个元素的某个部分

set和multiset用处还是挺大的,常用的也是insert(),erase()(值或者地址),size(),empty()之类的
支持迭代器遍历。

vector

当然vector是数组,是向量,不能像上面那样维护动态的平衡树
这里介绍一下vector作为双端队列的使用,以及vector一些不常见的内置函数

// 任意位置插入一个元素
vector<int>::iterator it = vec.begin();
vec.insert(it, 2);
//任意位置插入 n 个相同元素
vec.insert(iterator it, int n, const T& x);

//插入另一个向量的 [forst,last] 间的数据
vec.insert(iterator it, iterator first, iterator last);
vec.resize(10)//会分配 10 个 0 给vec,相当于 push_back(0) 10 次。
push_back()//后面插入
pop_back()//弹出最后一个元素
back()//取出最后一个元素
vec.front();//取出第一个

vec.erase(iterator it);//任意位置删除一个元素
vec.erase(iterator first, iterator last);//删除 [first,last] 之间的元素

at 方法访问:vec.at(1); // 和下标访问区别就是 at 会检查是否越界,是则抛出 out of range 异常

vector容器也适用迭代器

原文地址:https://www.cnblogs.com/gzr2018/p/11725498.html

时间: 2024-10-12 01:35:35

C++ STL中的自定义排序和vector的相关文章

STL中的各种排序函数

标准c++库中提供六种排序方法:qsort(),  sort(),stable_sort(),  partial_sort(),  list::sort(),  set/multiset qsort()比sort()慢并且不能排序构造函数.虚函数,一般不推荐使用.写一个比较函数传递给qsort()很麻烦: 后五个排序中,前三个是泛型算法,后两个则使用了某些容器的特别特性.所有的这些都是使用operator()来比较对象,但是在必要时指定用户自己的比较函数. 后五个每个都提供了自己的特征: 1.s

stl中map自定义比较函数

在stl中自定义map比较函数有两种方式,方式一在类中重载<操作符,方式二仿比较函数 1.方式一:重载<操作符 #include "stdafx.h" #include <map> #include <string> #include <iostream> using namespace std; class Key { public: Key(string name, int age) { this->name=name; thi

STL 中的链表排序

一直以来学习排序算法, 都没有在链表排序上下太多功夫,因为用得不多.最近看STL源码,才发现,原来即使是链表,也能有时间复杂度为O(nlogn)的算法, 大大出乎我的意料之外,一般就能想到个插入排序. 下面的代码就是按照源码写出的(去掉了模板增加可读性),注意forward_list是C++11新加的单向链表,这里选这个是因为它更接近我们自己实现链表时的做法. void sort_list(forward_list<int>& l){ auto it = l.begin(); if (

3.1.3 STL中list、map、vector的使用方法

(一)list的使用方法: 代码: #include <iostream> #include <list> #include <algorithm> #include <numeric> #include <iterator> using namespace std; typedef list<int> LISTINT; typedef list<char> LISTCHAR; int main() { LISTINT l

stl中常用的排序算法

#include"iostream" #include"vector" using namespace std; #include"string" #include"algorithm" void main_mergr() { vector<int > v1; v1.push_back(1); v1.push_back(2); v1.push_back(3); vector<int > v2; v2.p

Lucene 中自定义排序的实现

使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们就来看看在Lucene中如何实现自定义排序功能. Lucene中的自定义排序功能和Java集合中的自定义排序的实现方法差不多,都要实现一下比较接口. 在Java中只要实现Comparable接口就可以了.但是在Lucene中要实现SortComparatorSource接口和 ScoreDocCom

STL中sort排序算法第三个参数_Compare的实现本质

关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重载运算符和函数对象实现本质上是一样的:两者都是括号运算符的重载. 重载运算符利用了泛型模板,再重载模板中的括号运算福,接着重载里面的大于小于操作符: 而函数对象则是直接针对自己的对象重载括号运算符. 下图是其中一个泛型模板比较函数,位于头文件stl_function.h中. 『注:本文来自博客园“小

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学

c++ STL中的vector与list为什么没有提供find操作?

map里有,set里也有,vector,list没有,太不公平了吧. 其实应该考虑为什么map,set里有find操作. include<algorithm>里有通用的find操作,通用的find内部是从begin到end进行一次遍历,复杂度是O(n). 通过iterator从begin到end遍历map与set时,得到的结果是按key排序的结果,而不是插入时的顺序(所以这两个容器没有push_back操作), 其实,insert到map与set中的元素会被组织到一颗红黑树上,红黑树是一颗平衡