C语法—字符串、类、结构体、指针、链表、stl(vector)、位运算

字符串

cin >> str;             // 输入字符串时,遇到空格或者回车就会停止

cout << str << endl;    // 输出字符串时,遇到空格或者回车不会停止,遇到'\0'时停止

# fgets()会把回车也读入   fgets(a, 101,stdin)           字符串中有空格时候用

;    scanf 也会读入回车(替换比较时需要注意)     cin不会

// gets函数在新版C++中被移除了,因为不安全。
// 可以用fgets代替,但注意fgets不会删除行末的回车字符

字符数组的常用操作

#include <string.h>

(1) strlen(str),求字符串的长度
(2) strcmp(a, b),比较两个字符串的大小,a < b返回-1,a == b返回0,a > b返回1。这里的比较方式是字典序!
(3) strcpy(a, b),将字符串b复制给从a开始的字符数组。

 标准库类型string

可变长的字符序列,比字符数组更加好用。需要引入头文件:#include <string>

注意:不能用printf直接输出string,需要写成:printf(“%s”, s.c_str());         cout可以直接输出string

使用getline读取一整行        getline(cin, s);   字符串中有空格时候用  末尾不会多输入回车

使用puts()用头文件#include<stdio.h>   直接输出一个“....”具体的字符串    puts()也可直接输出一个字符串 如 puts(str);    puts()会自动输出字符串末尾的回车,cin和sanf不会

a.substr(0,p+1)   //substr 函数 (起始位置,长度)字符串截取

for (auto &c : s)   遍历字符串每个元素c,进行修改所以要加&取地址

str.back()  指的是字符串最后一个          str.popback() 指的是去掉字符串最后一个

#include<algorithm>      swap( , )               sort( , )       默认: 两个参数first,last,将[first, last)区间内元素升序排列。【注意区间为左闭右开】     sort(a,a+n)   a为数组  n为数组内元素个数

tolower(str[i]) 将该元素小写   toupper(str[i]) 将该元素大写        

#include<ctype.h>

双指针算法

 分为public和private: 公有代表在类外面可用 私有代表在类内部可用

                                     类中的变量和函数统称为成员变量

 结构体和类的作用是一样的。不同点在于类默认是private,结构体默认是public。

 构造函数对应赋值,也可以如下更快赋值

 指针

 开在栈里的一般是局部变量,是随机的数    开在堆里的一般是全局变量,均为0

 

 

 

 new 开辟一片动态空间,返回的是地址

如果定义的是成员变量,则用a.next()来调用

如果定义的是指针,则用->来调用

 

 

删除:要想删除一个节点,必须找到前一个节点的地址,然后令其指向下一个地址,完成删除操作。

 

反转链表

 

 

 

 

 

 

有序合并两个链表

两链表第一个公共节点

空节点的三种写法: 0 ,NULL ,nullptr

   

删除链表重复点

设置虚拟头节点,保证最后输出指向next为头节点

 

stl

vector

1. #include <vector>

vector是变长数组,支持随机访问,不支持在任意位置 O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。

声明

#include <vector>   // 头文件
vector<int> a;      // 相当于一个长度动态变化的int数组
vector<int> b[233]; // 相当于第一维长233,第二位长度动态变化的int数组
struct rec{…};
vector<rec> c;      // 自定义的结构体类型也可以保存在vector中

size/empty

size函数返回vector的实际长度(包含的元素个数),empty函数返回一个bool类型,表明vector是否为空。二者的时间复杂度都是 O(1)。所有的STL容器都支持这两个方法,含义也相同

clear

clear函数把vector清空。

 迭代器(一般不用,了解)

迭代器就像STL容器的“指针”,可以用星号*操作符解除引用。

一个保存int的vector的迭代器声明方法为:

vector<int>::iterator it;

vector的迭代器是“随机访问迭代器”,可以把vector的迭代器与一个整数相加减,其行为和指针的移动类似。可以把vector的两个迭代器相减,其结果也和指针相减类似,得到两个迭代器对应下标之间的距离。

begin/end(string也同理,string也属于是容器)

begin函数返回指向vector中第一个元素的迭代器。例如a是一个非空的vector,则*a.begin()与a[0]的作用相同。

所有的容器都可以视作一个“前闭后开”的结构,end函数返回vector的尾部,即第n 个元素再往后的“边界”。*a.end()与a[n]都是越界访问,其中n = a.size()。

vector的遍历

 for (vector<int>::iterator it = a.begin(); it != a.end(); it ++)   //与第二种方法一致,但更加简便
    cout << *it << endl;

front/back

front函数返回vector的第一个元素,等价于*a.begin()和a[0]
back函数返回vector的最后一个元素,等价于*--a.end()和a[a.size() – 1]

push_back()和pop_back()

a.push_back(x)把元素x插入到vector a的尾部。
b.pop_back()删除vector a的最后一个元素。

拓展: vector的拷贝 是每次*2的倍增拷贝

位运算

左移与右移

常用操作

 求x的第k位数字 x >> k & 1                  如上图

lowbit(x) = x & -x,返回x的最后一位1   如下图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值