STL 容器操作

  • vector

set转化为vector:vec.assign(set.begin(), set.end())

  • map

1. map默认从小到达排序,想要从大到小,可以:

map<string, int, greater<string>>

 2. map 不可以使用sort排序!不过可以使用在定义map的时候,传入函数指针自定义map排序

  • list

比如在第五个位置插入3个88的 错误方法

auto ite = data.begin();

data.insert(iter + 5388);

ite不可以直接+5,不支持这个操作,实际上ite一般支持++,比如++ite比ite++更简单?

正确方法:

auto iter = begin(data);

std::advance(iter, 5);

data.insert(iter, 3, 88);

 但是vector的insert就可以直接vec.insert(vec.begin() + 5, 88);

 

  • set

set没有push()和push_back()操作,取代的是:insert() 或 emplace()!

  • stack

top(), size(), empty()

push() / emplace(),pop()

swap()

  • priority_queue

优先队列,priority_queue<class Type,class Container,class Compare>,即类型,容器和比较器(比较器类型)

默认容器为vector,可以自定义容器类型,并自定义排序函数,我们并不关心优先队列是不是vector实现的!

但是要是出现了自定义类型,一般想要自定义函数,这个时候中间的容器就不可以省略了 —— 建议容器写在最后,根据自定义类型推测默认vector<T>容器!

自定义比较有三种方法:

// 在结构体/类内重载<
struct Status{
        int val;
        ListNode* node;
        bool operator < (const Status &tmp) const{ 
        // 函数必须是静态的 使得该函数可以被 const 对象也就是常量所调用
        // 形参可以加上const关键字和&,保证安全性,提高效率
            return val > tmp.val;
        }
    };
    priority_queue<Status> pq;  
// 自定义比较函数模板结构体,或者说重载的是()!!!
struct cmp{

    bool operator ()(const node &a, const node &b)
    {
        return a.value>b.value;// 按照value从小到大排列
    }
};
priority_queue<node, vector<node>, cmp>q;

第三种方法:友元函数,略

没有见到使lambda表达式实现的,因为它的参数不是一个函数,而是一个结构体,或者不理会参数重载更简单。

原文地址:https://www.cnblogs.com/Younger-Zhang/p/15111887.html