C basic part 2
新增一些关于C和C++的基础知识。
数组初始化符号
{}
Get array length(C)
1
2int arr[];
int length = sizeof(arr)/sizeof(arr[0]); // 总字节数/第一个元素字节数define
#define 名字 替换文本
(1)符号常量通常用大写字母拼写
(2)末尾无分号C中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中. INT_MAX = 2^31-1,INT_MIN= -2^31
逻辑移位
逻辑移位: (1)逻辑左移 (2)逻辑右移; 移出的空位都用0来补。
nullptr
其指c++ 中的空指针常量。
c++ delete
假设ptr是一个指针,delete ptr代表释放内存,只用来释放ptr指向的内存。
to_string()
将数值转换为字符串。
for循环遍历字符串的一种新方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using namespace std;
int main(void)
{
string str = "better";
for (char c : str)
{
printf("%c\n", c);
}
return 0;
}c++ auto (since C++ 11)(谨慎使用)
可以自动推断变量类型
- auto变量必须在定义时进行初始化,如果不进行初始化,就不能进行变量类型的推断了。
c++ pair/ make_pair
C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象。
make_pair
的用法
无需写出型别, 就可以生成一个pair对象。
例:std::make_pair(42, '@');
而不必费力写成:
std::pair<int, char>(42, '@')
值的访问: 两个值可以分别用pair的两个公有函数first和second访问。
map的count和find,map和unordered_map
使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。
使用find,返回的是被查找元素的位置,没有则返回map.end()。
string.substr()
string.substr(start, [length])
1
2
3string s = "12345"
string sub1 = s.substr(3); // sub1 = "345"
string sub2 = s.substr(3, 2); // sub2 = "34"string to int: stoi()
stoi(str, start_position, 2) 2是进制,此例意为将2进制的str从position转换成10进制
char to int:
c - '0'
int to char:
i + '0'
异或
- 性质:
a ^ b
即为a和b的二进制形式每一位进行运算,最后得到的结果。每位运算逻辑:
相同为0, 不同为1. 类似半加。 - 规律:
- 任何数和本身异或为
0
- 任何数和0异或为
本身
- 任何数和本身异或为
pow(), not power, 需要
cmath
头文件自己写的头文件要用
""
引用;标准的头文件要用<>
引用。非系统头文件的查找通常开始于源文件所在的路径。
声明与定义
定义只可出现一次,声明可以出现多次。
引用
int&
, 这里的&
不是取地址符号,叫做引用符号
.
变量的引用就是变量的别名。相当于一个人的小名
- 声明引用时必须指定代表是哪一个变量,即对它进行初始化如果只是
1
int &a = b; // 声明a是b的引用
int &a
, 这样就是错误的。 - 引用和其所代表的变量共享同一内存单元,系统不为引用另外分配存储单元。
- 如何判断
&
是引用
还是取地址符
方法: 判断&a
这样形式前是否有类型符号
C++中的
.h
和.cpp
文件在 C++ 中,分别使用
.h
和.cpp
来定义一个类。.h
中存放类的声明,函数原型(放在类的声明中)。.cpp
存放函数体。也就是说,一个存放声明(declaration),一个存放定义(definition)。
当数组作为函数参数进行传递时,数组就会自动退化为同类型指针。
1
2
3
4
5
6
7
8
9
10
11int GetSize(int data[])
{
return sizeof(data);
}
int main(void)
{
int data[] = {1, 3, 4, 5};
int size = Getsize(data); // 4
}vector
- front(): 返回第一个元素引用
- back(): 返回最后一个元素引用
- reverse一个vector:
reverse(res.begin(), res.end());
maltimap
multimap
容器保存的是有序的键/值对,但它可以保存重复的元素。map
注意: map中的key是唯一的,并且不能修改,遇到重复的key就会插入失败
C++ STL
accumulate
accumulate
定义在#include<numeric>
中,作用有两个,一个是累加求和,另一个是自定义类型数据的处理
累加求和
1
int sum = accumulate(vec.begin(), vec.end(), begin_value);
前两个形参: 累加元素范围; 第三个形参: 累加初值
一个例子
1
2
3
4
5
6
7
8
9
10
11
12
13
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 |
|
两个属性值: first
and second
1 | myMap.first # myMap->first是错误的写法 |
set
set中每个值都唯一,系统可以根据元素的值自动排序.
set.insert()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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