C basic part 2

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


  1. 数组初始化符号{}

  2. Get array length(C)

    1
    2
    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循环遍历字符串的一种新方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #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])

    1
    2
    3
    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. 异或

  • 性质: a ^ b即为a和b的二进制形式每一位进行运算,最后得到的结果。每位运算逻辑:
    相同为0, 不同为1. 类似半加。
  • 规律:
    • 任何数和本身异或为0
    • 任何数和0异或为本身
  1. pow(), not power, 需要cmath头文件

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

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

  3. 声明与定义

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

  4. 引用

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

  • 声明引用时必须指定代表是哪一个变量,即对它进行初始化
    1
    int &a = b; // 声明a是b的引用
    如果只是int &a, 这样就是错误的。
  • 引用和其所代表的变量共享同一内存单元,系统不为引用另外分配存储单元。
  • 如何判断&引用还是取地址符
    方法: 判断&a这样形式前是否有类型符号
  1. C++中的.h.cpp文件

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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. 累加求和

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

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

    一个例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #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中数据是无序的.

方法
  • unordered_set::find()

    unordered_set::find()函数是C++ STL中的内置函数,用于在容器中搜索元素。它返回元素的迭代器,如果找到其他元素,则返回指向unordered_set::end()的迭代器。

    用法: unordered_set_name.find(key)

    1
    if(s.find(xx) != s.end()) xxx
  • unordered_set::insert(element)

    unordered_set::insert(element)

  • set 与 unordered_set

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

unordered_map

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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

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

set

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

  • set.insert()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <stdio.h>
    #include <set>
    using namespace std;

    int main(int argc, char *argv[])
    {
    set<int> set1;
    for (int i = 0; i < 10; i++)
    {
    set1.insert(i);
    }
    set<int>::iterator it;
    for (it = set1.begin(); it != set1.end(); it++)
    printf("%d ", *it);

    return 0;
    }

–> 前一篇C basic part 1