char
1、char类型的1、2、3… 转为整形的问题:
//加入 想把char的6转为 int的6:
char c='6';
int a=c-'0'; // a即是int 的6
//反之,int 6转为 char 6
int a=6;
char c= a+'0';
链表
1、链表的新建
链表的定义一般如下:
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {} //空构造
ListNode(int x) : val(x), next(nullptr) {} //赋有值的构造
ListNode(int x, ListNode *next) : val(x), next(next) {} //赋有值和下一个元素的构造
};
如果想要新建一个链表元素指针:
ListNode *pre1=new ListNode(-1) // 赋有值的构造
ListNode *pre2=new ListNode(-1,pre1) // 赋有值和下一个元素的构造
2、遍历链表使用的while循环内的条件
当遍历链表,如果只想对当前遍历,那么:
while(head!=nullptr){
}
如果是想对当前的next遍历,那么:
//错误的:
while(head->next!=nullptr){ //因为这是head有是nullptr的风险
}
//正确的:
while(head!=nullptr&&head->next!=nullptr){ //先保证head!=nullptr
}
string
1、反转一个string
string s="cjaajcl";
reverse(s.begin(),s.end());//直接反转两个指针即可
2、字符串中的字符表示
string s="qwcmcmal";
vector<int> ss(26,0); //创建一个用于表示字母的数组,长度是26,次数初始化是0
for(char c:s){
ss[c-'a']++; //这样可以表示出字符的相对位置,比如:c='b',c-'a'=1,即表示
}
3、string在某个索引处插入字符
string s="qqqqqqq";
s.insert(s.begin(),'a') // s : "aqqqqqqq" 插入到了最前面。
s.insert(s.begin()+1,'a') // s : "qaqqqqqq" 插入到了第一个字符的后面。
4、int转换成string
int a=88;
string s=to_string(a);
5、string分割字符串 (split)
看到的别人的思路:
// 分割字符串
vector<string> words;
string s;
for (int i = 0; i < str.size(); i++)
if (str[i] == ' ') { //按照 ‘ ’分割
if (s.size())
words.push_back(s);
s = "";
} else
s += str[i];
if (s.size())
words.push_back(s);
vector
1、合并两个vector
一种是vector的insert方法,一种是stl的merge方式,当然,还有遍列元素的方式。
vector的insert方式:(以下为将vec1和vec2的内容合并到vec3中)
vector<string>vec1,vec2,vec3;
//... vec1,vec2赋值
vec3.insert(vec3.end(),vec1.begin(),vec1.end());
vec3.insert(vec3.end(),vec2.begin(),vec2.end());
merge方式:
vector<string>vec1,vec2,vec3;
//... vec1,vec2赋值
sort(vec1.begin(),vec1.end());
sort(vec2.begin(),vec2.end());
vec3.resize(vec1.size()+vec2.size());
merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec3.begin());
merge方式要注意三点:
1、vec3需要指定好大小,不然会报错。
2、merge的时候指定vec3的位置一定要从begin开始,如果指定了end,它会认为没有空间,当然,中间的位置我没有试,回头有空试一下。
综上,我还是觉得对于合并vector来说,还是insert会比较简单一点,至于效率问题,就没有测试啦。
2、vector的assign方法
vector<int> v1={4, 9, 5};
v1.assign(10,100); //v1里面变成10个100,但是原来的4,9,5会被覆盖
3、vector 初始化成 m个n
vector<int> dp(8, 0);
这是dp中有8个0
4、在没有给vector指定内存空间时,不能使用vector[2] 这种下标方式访问数据
初始化办法:
一维:
vector<int> obj(size);
或
vector<int> obj;
obj.resize(size);
二维:
vector<vector<int> > obj(rsize, vector<int>(lsize, 0));
或
vector<vector<int>> obj;
obj.resize(rsize);
for(int i = 0; i < rsize; i++)
obj[i].resize(lsize);
当调用vector obj(size)时,调用构造函数 :
explicit vector(_CRT_GUARDOVERFLOW const size_type _Count, const _Alloc& _Al = _Alloc())
: _Mypair(_One_then_variadic_args_t(), _Al) { // construct from _Count * _Ty(), optional allocator
_Construct_n_copies_of_ty(_Count, _Value_init_tag{});
}
当调用vector obj(size, 0)的时候,调用构造函数:
vector(_CRT_GUARDOVERFLOW const size_type _Count, const _Ty& _Val, const _Alloc& _Al = _Alloc())
: _Mypair(_One_then_variadic_args_t(), _Al) { // construct from _Count * _Val, optional allocator
_Construct_n_copies_of_ty(_Count, _Val);
5、把一个set转化成vector
vector<int>(result_set.begin(), result_set.end()); //直接在地址上就转化
map
1、初始化一个map
unordered_map<int, int> frequency;
string s="ccaca";
for (char ch : s) { //这样每一个出现在s中的ch,都会被添加上1,下面有frequency[ch]++
frequency[ch]++;
}
c++语言知识
1、c++三目运算符
int a=10,b=20,c=0;
//条件① 语句① 语句②
c=a<b ? 1 : 2;
cout << c << endl;
2、int 和小数的计算
int a=9;
double b=a/2; //这是b=4.0,因为a是int型,起码在计算之后 a/2是4.0,前面用double接收的也是4.0
double a=9;
double b=a/2; //这是b=4.5,因为a是double型,在计算之后 a/2就是4.5,
3、位运算
对于不能只用额外空间的题目,一般要考虑位运算了。
异或:
相同为0,不同为1。(参考力扣136)
c++的异或运算:
a=b^c;