C++
字符串
关于初始化
- =是拷贝初始化,而string s(“qwqw”);是直接初始化。(均是)
- 初始化10个c:string s(10,‘c’);
对象操作
- 读取cin,会自动忽略开头空格,遇到空格停止,
比如 ‘’[空格][空格][空格]hello world[空格][空格][空格]’’读成hello
- 读取未知数量的string对象:while小括号里面cin
- getline(cin,mystring);:读取换行符,但不收入
- 读取输出超过80字符的行,2、3点 配合if
string::size_type类型(P79)
- 最好不要直接在表达式混用size()函数,因为返回这个标题的类型,无符号整型,会出现一想不到的问题
#include<bits/stdc++.h>
using namespace std;
int main()
{
string line = "ABCD";
int n = -6;
if(line.size() < n)
{
cout << "这就是惊喜" << endl;
}
return 0;
}
负数会被转化成很大的无符号整型(很大是因为无符号二进制首位为1的缘故)
6. 字符串比较,一个一个比,比不出来比长短
Hiya > Hello World > Hello
- 字面值和string对象相加
字面值相加时候至少保证每个字面值和一个string相加(P81) - 字符处理函数,是否大小写,空格等P82
ps:toupper等是返回一个值,而不是把传进去的的改变
eg:
引用改变string里面的所有字符(如变大写)
9.decltype类似auto: decltype(exp) varname = value
vector
类模板,c++还有函数模板
定义,初始化
vector< int > v
vector< int > v1(v2)
vector< int > v1 = v2
vector< int > v(n, val)
vector< int > v{1,2,3}
vector< int > v = {1,2,3}
如果想定义大小,只能使用直接初始化,括号那种,而且只有一个括号和数字,那个给的是大小
实际上没有必要一开始设置大小,他能高性增长,除了所有值一样
关于迭代器使用
- 通常我们不需要非常清楚迭代器是什么类型,用auto去接收
- 而且在for里面要习惯用 != 来判断迭代器是否到end,因为这个对c++标准库提供的所有容器都适用
- const_iterator只读元素,不能修改
- cbegin,cend,就是const的迭代器
- 解引用,访问成员 (*it).empty() 等价 it->empty()
注意
使用了迭代器的循环体不要向所属容器添加元素
map插入,排序
-
insert方法: myMap.insert(pair<int,string>(1,“a”))
-
[]数组方法,比较方便,没有就创建,有就覆盖
-
排序,这种排序是排到vector里面,不会改变map,用引用可以
- cmp函数的参数是pair
- 放入vector,以pair形式
vector< pair<string,int> > vec;
for(map<string,int>::iterator it = mp.begin(); it != mp.end(); it++){
vec.push_back( pair<string,int>(it->first,it->second) );
}
sort(vec.begin(),vec.end(),cmp);
bool cmp(pair<string,int> a, pair<string,int> b) {
return a.second < b.second;
}
数组
- 数组,方括号的那种,数组间拷贝赋值(等号那种)
- 类型修饰符从右向左绑定,最好理解成由内向外
int *ptr[10]; //十个整型指针的 数组
int &refs[10] = ?; //无
int (*Parrey)[10]; //Parrey指向一个数组,数组有十个整型
int (&arrFef)[10]; //arrRef引用一个数组,数组有十个整型
eg:
int *(&arry)[10] = ptrs; //arry是数组的引用,该数组有10个指针。
书P103