STL——函数

转自百度百科

主要记录写题时遇到的 STL 的一些函数,

一,离散化

string s[10005];
vector<string>v;
int main(void)
{
    while (scanf("%d", &n) != EOF)
    {
        v.clear();
        for (int i = 0; i < n; i++)
        {
            cin >> s[i];
            v.push_back(s[i]);
        }
        sort(v.begin(), v.end());
        int lon = unique(v.begin(), v.end()) - v.begin();
        for (int i = 0; i < n; i++)
        {
            printf("%d\n", lower_bound(v.begin(), v.begin() + lon, s[i]) - v.begin() + 1);
        }
    }
    return 0;
}

1,迭代器:可以看成是复杂的指针

迭代器相减:可以看成指向同一数组的指针相减,最后结果为 int 类型,代表指针所指向的两个元素的位置距离

2,unique:

本质:STL 函数,包含于 algotithm 头文件中。功能是将数组中相邻的重复元素去除。

然而其本质是将重复的元素移动到数组的末尾,最后再将迭代器末尾指向最后不重复的下标。所以容器最后长度没有变化

返回值:返回一个迭代器,指向重复元素的首地址

功能:unique函数可以去除数组中相邻重复项

所以,想要实现完全去重功能,需要在执行 unique 函数之前先对数组进行排序

3,

lower_bound

返回值:返回一个迭代器, 它指向在 (first,last) 标记的有序数列中可以插入 value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个大于等于 value 的值

upper_bound

返回值:返回一个迭代器, 它指向在 (first,last) 标记的有序数列中可以插入 value,而不会破坏容器顺序的第一个位置,而这个位置标记了一个大于 value 的值

注意:调用 lower_bound 和 lower_bound 之前必须确定序列为有序序列,否则调用出错。

例如:map中已经插入了1,2,3,4的话,

如果l lower_bound(2),返回的是 2,

而    upper_bound(2) ,返回的就是 3

二,求瑶瑶的第 K 大

选择快排的实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<functional>
#include<algorithm>
#include<queue>
using namespace std;
#define N int(2e6+5)
int a[N], b, c;
void qs(int L, int R)
{
    if (L <= R)
    {
        int i = L, j = L;
        for (; i <= R; i++)
        {
            if (a[i] > a[R])
            {
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
                j++;
            }
        }
        int t = a[R];
        a[R] = a[j];
        a[j] = t;

        if (c - 1 == j)  // 快排的有选择的进行排序
            return;
        else if (j > c - 1)
            qs(L, j - 1);
        else
            qs(j + 1, R);
    }
}
void scan(int &x)
{
    char c;
    do c = getchar();
    while (c<‘0‘ || c>‘9‘);

    x = c - ‘0‘;
    while (‘0‘ <= (c = getchar()) && c <= ‘9‘)
        x = x * 10 + c - ‘0‘;
}

void print(int a)
{
    if (a > 9)
        print(a / 10);
    putchar(a % 10 + ‘0‘);
}
int main1(void)  // 快排优化
{
    while (scanf("%d%d", &b, &c) != EOF)
    {
        for (int i = 0; i < b; i++)
            scan(a[i]);

        qs(0, b - 1);
        print(a[c - 1]);
        puts("");
    }
    system("pause");
    return 0;
}
int main2(void)
{
    int n, k;
    scanf("%d%d", &n, &k);
    for (int i = 0; i<n; i++)
        scanf("%d", &a[i]);
    nth_element(a, a + k - 1, a + n, greater<int>());
    printf("%d", a[k - 1]);

    system("pause");
    return 0;
}

1,less() 和 greater()   

两个函数的头文件是<functional>

less():  类似于 < 的作用,用于比较两个值的大小,但是是泛型函数,支持大多数类型的值比较

greater:  类似于 > 的作用,用于比较两个值的大小,但是是泛型函数,支持大多数类型的值比较

2,nth_element

头文件: <algorithm>

功能:对给定范围进行排序

参数: nth_element (first , nth , last , comp)

first,last:   随机访问迭代器.指定了需要重新"排序"的范围.包括 first ,但不包括 last.

nth:  随机访问迭代器.指向范围[first,last)内的一个位置.这个位置将放置排序后应该放于此位置的元素

comp: 二元函数. 返回值需为 bool 类型, 表明是否第一个参数应该排序到第二个参数的前面. 此函数不应该修改参数值.可以是一个函数指针或函数对象.

总之:

对给定范围[first,last)内的元素进行重新布置.

方法是,nth 位置的元素放置的值就是把所有元素排序后在 nth 位置的值.把所有不大于 nth 的值放到 nth 的前面,把所有不小于 nth 的值放到 nth 后面.

它的代码实现应该类似于 选择快排

======== ======== ======== ======== ====== ====== ===== === == =

一剪梅·舟过吴江  蒋捷 宋

一片春愁待酒浇。江上舟摇,楼上帘招。秋娘渡与泰娘桥,风又飘飘,雨又萧萧。
何日归家洗客袍?银字笙调,心字香烧。流光容易把人抛,红了樱桃,绿了芭蕉。

原文地址:https://www.cnblogs.com/asdfknjhu/p/12584137.html

时间: 2024-11-05 03:35:44

STL——函数的相关文章

----堆栈 STL 函数库 ----有待补充

#include<cstdio> #include<string> #include<vector> #include<iostream> using namespace std; int main() { vector<int> a; int i,b; for(i=0;i<56;i++) a.push_back(i); printf("%d",a.size()); a.resize(10); for(i=0;i<

常用的 STL 函数

常用的 STL 函数 Table of Contents 介绍 string 队列 最大堆 集合 哈希 map, pair list vector 介绍 容器, 迭代器, 算法 容器: 顺序容器 (vector, list, deque, string), 有序集合 关联容器 (set, multiset, map, multimap), 包含查找元素到键值 迭代器: 遍历容器 traverse container 算法库: 排序, 不可变序, 变序性, 数值 迭代器可以使用 +1 的, vec

STL函数对象和Lambda表达式

1.基本概念 Function object是定义了operator()的object. FunctionObjectType fo; fo(…);调用函数对象的operator()代替函数fo()的调用. 等价于:fo.operator()(…); 函数对象的三个好处: (1) 函数对象可以有自己的状态,因此可能是更聪明的.你可以拥有同一个函数对象的两个实例,它们可能有不同的状态. (2) 每个函数对象是一个类型.你可以把函数对象作为模版的参数用于指定一个特定的行为. (3)函数对象通常比函数

STL 函数对象

一.函数对象? 若一个类重载了运算符 “()”,则该类的对象就成为函数对象 1 class CMyAverage { //函数对象类 2 public: 3 double operator() ( int a1, int a2, int a3 ) { 4 return (double)(a1 + a2+a3) / 3; 5 } 6 }; 7 CMyAverage average; //函数对象 8 cout << average(3,2,3); // average.operator()(3,

STL源码剖析——STL函数对象

前言 在STL中,函数对象也是比较重要的,有时候可以限定STL算法的行为,例如在前面介绍的<STL算法剖析>中,每个算法基本上都提供了两个操作版本,其中就用一个版本允许用户指定函数对象,这样可以根据用户的需要对算法进行操作.函数对象是一种具有函数特质的对象,所以可以作为算法的参数.本文介绍的函数对象比较简单,是基于一元或者二元操作结构的算术类函数对象.关系运算类函数对象.逻辑运算类函数对象.在定义函数对象时,为了使其具有函数行为,则必须重载operator()操作符.本文源码出自SGI STL

SGI STL 函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析

在C++ STL的SGI实现版本中,一级空间配置器class __malloc_alloc_template中有一个静态函数的实现如下: static void (*set_malloc_handler(void (*f)()))() { void (*old)() = __malloc_alloc_oom_handler; __malloc_alloc_oom_handler = f; return (old); } 没接触过函数指针的人看到这段代码可能会很头疼,不知道这个函数表达什么意思.

C++ 11 - STL - 函数对象(Function Object) (上)

1. 定义 在STL中,可以把函数传递给算法,也可以把函数对象传递给算法. 那么,什么是函数对象呢? 我们来看下它的声明: class X { public: // define function call operator return-value operator() (arguments) const; ... } 你可以这样调用:X fo; ... fo(arg1, arg2); 我们来看个简单的打印的例子 PrintInt.h #ifndef Print_Int_H_ #define

STL 函数适配器(function adapter)

函数适配器(function adapter):通过不同函数适配器的绑定,组合和修饰能力,可以实现强大的功能,配合STL泛型算法完成复杂功能. 绑定(bind) template <class _Operation> class binder1st : public unary_function<typename _Operation::second_argument_type, typename _Operation::result_type> { protected: _Ope

C++STL - 函数模板

模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...> 返回类型 函数模板名(调用形参表){函数体} 在返回类型,调用形参表和函数体中,所需要类型的地方都可以引用模板形参表中类型形参 template<typename A,typenamen B,typename _C> A function(B arg){ _C var; ... } 2.使