C++ STL编程小结

2019/09/03 C++ 共 1889 字,约 6 分钟

set/map最小值和最大值

// for std::set
// std::set<int> s;
auto min = *s.begin();
auto max = *s.rbegin();


// for std::map<int,string> s
auto minKey = s.begin()->first;
auto maxKey = s.rbegin()->first;

C++ set/map模拟最小堆,最大堆

用于求解 TopK Elements 问题,也就是 K 个最小元素的问题。可以维护一个大小为 K 的最小堆,最小堆中的元素就是最小元素。

最小堆需要使用小顶堆来实现,小顶堆表示堆顶元素是堆中最小元素。这是因为我们要得到 k 个最大的元素,因此当遍历到一个新的元素时,需要知道这个新元素是否比堆中最小的元素更大,更大的话就把堆中最大元素去除,并将新元素添加到堆中。所以我们需要很容易得到最小元素并移除最小元素,小顶堆就能很好满足这个要求。

堆也可以用于求解 Kth Element 问题,得到了大小为 k 的最小堆之后,因为使用了小顶堆来实现,因此堆顶元素就是第 k 大的元素。

(1)最小堆求第K大的值:

set<int, less<int>> s;
mulitset<int, less<int>> ms;

(2)最大堆求第K小的值:

set<int, greater<int>> s;
mulitset<int, greater<int>> ms;

示例:

    vector<int> nums = {1,2,2,5,3,5};

    //最小堆
    set<int, less<int>> s1;
    s1.insert(nums.begin(), nums.end());
    printf("\n");
    for (const auto & e : s1)
    {
        printf("->%d", e);
    }
    printf("\n");


    //最大堆
    set<int, greater<int>> s2;
    s2.insert(nums.begin(), nums.end());
    printf("\n");
    for (const auto & e : s2)
    {
        printf("->%d", e);
    }
    printf("\n");

运行结果:

->1->2->3->5

->5->3->2->1

FAQ

Error:‘itoa’ was not declared in this scope

有些编译器不支持itoa,因为它不是标准的。

解决方法

c++11: std::to_string

sprintf
stdio.h
char *c = new char;
sprintf(c,"%d",num);

stringstream
sstream.h
stringstream ss; int x = 1;
ss << x;
string str = ss.str();

c++ string 末尾追加char字符

在string s末尾追加’a’:

s = s + 'a'; //这样写是可以的
s += 'a'; //这样写是不对的

c++ string倒序

string s("hello");
reverse(s.begin(), s.end());

关于lower_bound( )和upper_bound( )的常见用法

lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的。

在从小到大的排序数组中,

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

参考链接

文档信息

Search

    Table of Contents