C basic part 2

2020/10/01

新增一些关于C和C++的基础知识。


  1. 数组初始化符号{}

  2. Get array length(C)

    int arr[];
    int length = sizeof(arr)/sizeof(arr[0]); // 总字节数/第一个元素字节数
    
  3. define

    #define 名字 替换文本

    (1)符号常量通常用大写字母拼写 (2)末尾无分号

  4. C中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中. INT_MAX = 2^31-1,INT_MIN= -2^31

  5. 逻辑移位

    逻辑移位 = (1)逻辑左移 (2)逻辑右移; 移出的空位都用0来补。

  6. nullptr

    其指c++ 中的空指针常量。

  7. c++ delete

    假设ptr是一个指针,delete ptr代表释放内存,只用来释放ptr指向的内存。

  8. to_string()

    将数值转换为字符串。

  9. for循环遍历字符串的一种新方法

    #include <stdio.h>
    #include <vector>
    #include <string>
    using namespace std;
    
    int main(void)
    {
        string str = "better";
        for (char c  = str)
        {
            printf("%c\n", c);
        }
    
        return 0;
    }
    
  10. c++ auto (since C++ 11)(谨慎使用)

    可以自动推断变量类型

    1. auto变量必须在定义时进行初始化,如果不进行初始化,就不能进行变量类型的推断了。
  11. c++ pair/ make_pair

    C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象。

    make_pair的用法 无需写出型别, 就可以生成一个pair对象。 例: std =:make_pair(42, '@');

    而不必费力写成: std =:pair<int, char>(42, '@')

    值的访问 = 两个值可以分别用pair的两个公有函数first和second访问。

  12. map的count和find,map和unordered_map

    使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。

    使用find,返回的是被查找元素的位置,没有则返回map.end()。

  13. string.substr()

    string.substr(start, [length])

    string s = "12345"
    string sub1 = s.substr(3); // sub1 = "345"
    string sub2 =  s.substr(3, 2);  // sub2 = "34"
    
  14. string to int = stoi()

    stoi(str, start_position, 2) 2是进制,此例意为将2进制的str从position转换成10进制

  15. char to int = c - '0'

  16. int to char = i + '0'

  17. 异或

  1. pow(), not power, 需要cmath头文件

  2. 自己写的头文件要用""引用;标准的头文件要用<>引用。

    非系统头文件的查找通常开始于源文件所在的路径。

  3. 声明与定义

    定义只可出现一次,声明可以出现多次。

  4. 引用

int&, 这里的&不是取地址符号,叫做引用符号. 变量的引用就是变量的别名。相当于一个人的小名

  1. C++中的.h.cpp文件

    在 C++ 中,分别使用.h.cpp 来定义一个类。 .h 中存放类的声明,函数原型(放在类的声明中)。 .cpp 存放函数体。

    也就是说,一个存放声明(declaration),一个存放定义(definition)。

  2. 当数组作为函数参数进行传递时,数组就会自动退化为同类型指针。

    int GetSize(int data[])
    {
    return sizeof(data);
    }
    
    int main(void)
    {
        int data[] = {1, 3, 4, 5};
        int size = Getsize(data); // 4
    
    }
    
  3. vector

    • front() = 返回第一个元素引用
    • back() = 返回最后一个元素引用
    • reverse一个vector = reverse(res.begin(), res.end());
  4. maltimap

    multimap 容器保存的是有序的键/值对,但它可以保存重复的元素。

  5. map

    注意 = map中的key是唯一的,并且不能修改,遇到重复的key就会插入失败


C++ STL

accumulate

accumulate定义在#include<numeric>中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理

  1. 累加求和

    int sum = accumulate(vec.begin(), vec.end(), begin_value);
    

    前两个形参 = 累加元素范围; 第三个形参: 累加初值

    一个例子

    #include <numeric>
    #include <vector>
    #include <stdio.h>
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        int arr[] = {10, 20, 30, 40, 50};
        vector<int> va(&arr[0], &arr[5]);
        int sum = accumulate(va.begin(), va.end(), 0);
        printf("%d\n", sum);
        return 0;
    }
    

unordered_set

定义

c++ unordered_set定义 = 是一个集合,集合中的每一个元素都是唯一的,就算插入几个相同的元素,但是最后保留下的只有一个。

注意 = unordered_set中数据是无序的.

方法

何时使用set = 需要有序的数据!

unordered_map

#include <stdio.h>
#include <unordered_map>
#include <map>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    unordered_map<int, string> myMap = {{5, "张大"}, {6, "李五"}};
    myMap[2] = "李四";
    myMap.insert(pair<int, string>(3, "陈二"));

    auto iter = myMap.begin();
    while (iter != myMap.end())
    {
        cout << iter->first << "," << iter->second << endl;
        ++iter;
    }
    return 0;
}

两个属性值 = first and second

myMap.first # myMap->first是错误的写法
myMap.second

set

set中每个值都唯一,系统可以根据元素的值自动排序.


–> 前一篇C basic part 1