C++语言

基础知识

typedef type newname; // 为已有的类型取一个新名字

// 枚举类型
enum color {red, green=5, yellow};
// color: 枚举名
// red, green, yellow: 标识符
// 默认,第一个标识符的值为0,第二个标识符的值为1,以此类推
// 也可以赋值,此时yellow=6,总是比前一个大1

// 定义常量
#define LENGTH 10
const int LENGTH 10;

// 杂项运算符
sizeof(a) // 4,a为整数

// 查看数据类型
#include<typeinfo>
cout << typeid(a).name() << endl;
cout << (typeid(a) == typeid(b)) << endl;

// 数组二分查找
int a[10];
int pos1 = lower_bound(a, a + 10, b) - a; // 返回数组中第一个大于或等于b的位置
int pos2 = upper_bound(a, a + 10, b) - a; // 返回数组中第一个大于b的位置

// int极值
#include <climits>
int a = INT_MAX;
int b = INT_MIN;
long long c = LLONG_MAX;

vector

#include <vector>
using namespace std;
int main()
{
    vector<int> obj;
    vector<int> obj(n, 0); // 一维向量初始化
    vector<vector<int>> obj(n, vector<int>(n, 0)); // 二维向量初始化
    obj.push_back(1); // 向末尾添加一个元素
    obj.emplace_back(1); // emplace_back能通过参数构造对象,不需要拷贝或者移动内存
    obj.pop_back();   // 删除末尾的元素
    length = obj.size();
    obj.clear(); // 清楚容器内所有元素
    vector<int> cut_obj(obj.begin() obj.begin() + 5); // vector截取
    
    head = obj.begin(); // 容器的头指针
    tail = obj.end();   // 容器最后一个元素位置+1的指针
    sort(obj.begin(), obj.end()); // 从小到大排序 #include<algorithm>
    reverse(obj.begin(), obj.end()); // 翻转

    //vector拼接
    vector<int> a = {0,1};
    vector<int> b = {2,3};
    b.insert(b.begin(), a.begin(), a.end()); // b 拼接 a
    b.insert(b.end(), a.begin(), a.end());  // a 拼接 b

    #include<algorithm>
    maxValue = *max_element(obj.begin(), obj.end()); // 最大值 
    minValue = *min_element(obj.begin(), obj.end()); // 最小值
    maxIndex = max_element(obj.begin(), obj.end()) - obj.begin(); // 第一个最大值的下标
    minIndex = min_element(obj.begin(), obj.end()) - obj.begin(); // 第一个最小值的下标
    
    #include<numeric> 
    sum = accumulate(obj.begin(), obj.end(), 0);
    
    obj.erase(it); //返回指向删除后下一个的迭代器

    all_of(obj.begin(), obj.end(), [](int& item)(return 100 < item;)); // 是否容器中所有元素都满足条件
    any_of(obj.begin(), obj.end(), [](int& item)(return 100 < item;)); // 是否容器中存在元素满足条件
    none_of(obj.begin(), obj.end(), [](int& item)(return 100 < item;)); // 是否容器中所有元素都不满足条件
    
    // 判断元素是否存在
    auto it = find(obj.begin(), obj.end(), 5);
    if (it != obj.end()) cout << "True" << endl;
    else cout << "False" << endl;
}

map

#include <map>
using namespace std;
int main()
{
    map<int, string> mapA;
    mapA.insert(pair<int, string>(1, "student_one")); // 插入方式一
    mapA[2] = "student_two"; // 插入方式二
    
    // map的遍历
    int n = mapA.size();
    for (auto iter = mapA.begin(); iter != mapA.end(); iter++)  {
        cout << iter->first << ' ';
        cout << iter->second << endl;  
    }
    for (auto& c : mapA) {
        cout << c.first << " " << c.second << endl;
    }
    for (auto& [a, b] : mapA) {
        cout << a << " " << b << endl;
    }
    
    // 查询
    auto iter = mapA.find(2); //返回迭代器 没有则返回mapA.end()
    
    // 删除
    mapA.erase(iter);
    mapA.erase(1);
    mapA.erase(mapA.begin(), mapA.end());
}

set

#include <set>
int main()
{
    set<int> s; // set内部由红黑树实现
    int a = 1;
    s.insert(a);
    s.erase(a);
    s.count(a); // 存在返回1,否则返回0
    auto iter = s.lower_bound(a); // 返回第一个大于等于a的元素的迭代器,没有返回s.end(),时间复杂度O(logn)
    iter = s.upper_bound(a);      // 返回第一个大于a的元素的迭代器,没有返回s.end(),时间复杂度O(logn)
    // 区别于 auto iter = lower_bound(s.begin(), s.end(), a); 时间复杂度是O(n+logn)(存疑)
    
    set<int> result;
    set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(result, result.begin())); // 交集
    set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(result, result.begin())); // 并集
    set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(), inserter(result, result.begin())); // 补集

}

排序

#include<algorithm>
bool campare(int a, int b)
{
    return a < b; // 升序排列 a>b为降序排列
}
int main()
{
    int a[20] = {...};
    sort(a, a + 20, compare);

    sort(a.begin(), a.end()); // 正序
    sort(a.begin(), a.end(), greater<int>()); // 倒序
}

优先队列

#include<queue>
priority_queue<int, vector<int>, greater<int>> q; // 小根堆
priority_queue<int, vector<int>, less<int>> q; // 大根堆
priority_queue<int> q; // 对于基础类型 默认是大根堆

q.push(i);
q.empty(); // true or false
q.top(); // 返回队首元素
q.pop();

// 对于自定义类型
struct tmp1 {
    int a, b;
    tmp1(int a, int b) : a(a), b(b){};
    bool operator < (const tmp1& x) const {
        return a < x.a;
    }
};
priority_queue<tmp1> q; // 大根堆 不满足条件的优先出队

struct cmp {
    bool operator () (tmp1 x1, tmp1 x2) {
        return x1.a < x2.a;
    }
};
priority_queue<tmp1, vector<tmp1>, cmp> q;

位运算

int __builtin_ffs (unsigned int x)       //返回x的最后一位1的是从后向前第几位,比如7368(1110011001000)返回4。
int __builtin_clz (unsigned int x)       //返回前导的0的个数。
int __builtin_ctz (unsigned int x)       //返回后面的0个个数,和__builtin_clz相对。
int __builtin_popcount (unsigned int x)  //返回二进制表示中1的个数。
int __builtin_parity (unsigned int x)    //返回x的奇偶校验位,也就是x的1的个数模2的结果。

字符串

#include <string>
#include <cstring>

int main()
{
    string s = "hello";
    if (s.find('a') == s.npos) {
        cout << "No matched" << endl;
    }

    // int转string
    string s = to_string(132);
    
    //string转int
    int a = atoi(s.c_str()); //超过int范围输出上下界
    int b = stoi(s); //默认在int范围内,超过范围报runtime error

    // 字符串字典序比较
    cout << (string("139") < string("165")) << endl; // 需要强制转换为string类型,否则比较的则是字符串的起始地址
}

multiset

#include <multiset>
int main()
{
    multiset<int> s; // multiset内部由红黑树实现 支持重复元素
    s.insert(1); // 插入元素
    s.emplace(2); // 插入元素
    s.erase(1); // 删除全部为1的元素
    multiset<int>::iterator it = s.begin();
    s.erase(it);
    int maxValue = *s.rbegin(); // 最大值
    int minValue = *s.begin(); // 最小值
}
posted @ 2021-02-28 16:11  AlenDou  阅读(189)  评论(0编辑  收藏  举报