11.string(下)

流插入流提取 io 流最好不要加const

这样测试

io流插入流提取是不是必须写成友元函数,不是的,不需要访问他的私有,遍历访问直接就走了,范围for就是迭代器,下标【】就实现了,



空格 换行都给了,结束不了,越过了空格,下一个直接拿到5了,cin,和scanf输入和提取任意类型值,默认空格和换行都是分隔符,空格就被忽略掉了
所以这里用get,get就不用管分隔符,就是一个字符一个字符的读,不涉及别的类型,只有字符就不涉及分隔符,

这还多了个hello world ,因为s1之前就是hello world ,标准库这种情况hello world 就不会保留
所以这clear 一下,不清空间,清数据 string。h中
若想拿到1234 56就要写getline
不理解就记住,cin默认提取不到 空格和换行
cin对于特别长的字符串,不断+=字符还是蛮吃亏的,不断扩容,有很多消耗。提前开空间也不知道开多少,所以以下思路:
istream& operator>>(istream& in, string& s){s.clear();const int N = 256;char buff[N];int i = 0;char ch;//in >> ch;ch = in.get();while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == N-1){buff[i] = '\0';s += buff;i = 0;}//in >> ch;ch = in.get();}if (i > 0){buff[i] = '\0';s += buff;}return in;}
}每次255,走三次就进来了,buffer当做我的缓冲,
若给string开空间是长期开,除非析构,buffer开是栈上不会长期开,开很快,如果很长,我不会频繁扩,每插入200多个才扩,甚至不需要,+=string,不够2倍还是按2倍扩,所以甚至不需要,如果插入很短的,我这个string也不用开很大,buffer再加大,扩容更少。
要实现getline 直接把“ ”和换行换成换行。
编码:内存磁盘只能保存整形,那文字符号咋办,值和符号映射编码关系,美国的就出来ASCLL编码表。外国用的少所以一共用了128个,
打印过程是查编码表的过程,
所谓乱码就是值和表对不上
但是中文很多,没法用,
简单了解:
utf8是变长编码中文一般用两个字符,
反正是一个值对应一个符号。一个汉字用两个字节存储
可以通过改变每个字节 ++ --就可以改变文字
为什么string是模版
这里并不一定是char,char的时候默认string ,这时候默认支持utf8,
这时候就是四个字节
这是国际编码,,所有文字,,
gbk是国内的,没特殊需求都是utf8,windous就是gbk,
