hello,苦力怕又跟大家见面啦。今天又有一个朋友跟我说他要让我帮他记记他去逛街买了些啥,具体的呢就是说他想让我编个程序(怎么天天叫我编程序),他每买一个东西就把东西的名字输入到我的程序中来,逛完街以后他想看看他到底买了啥,要不然心里没底儿,怕人多收他钱。
然后,就没有然后了,就是这样一个the easiest的问题,却让一些人做不出来,因为名字有可能有很多个字,有人可能会问,我们不是有vector吗,但是!作为新一代懒人,我们还有更好的方法。。。
对,string出场了。
string是个啥
string也是一个标准库类型,它就是字符串,准确说是C++风格的字符串,因为毕竟还有C风格字符串吗(其实就是字符数组)。
可能有些玩过python的人对str有些印象,而我们今天所学习的string就是个跟str差不多的东西
比如都是可以直接输入输出的,不像C风格,还要一个一个getchar。还有比如都可以想多长就多长。
所以是不是很想来康康怎么用的呢?
string的各种操作
string的引入
因为string是一个标准库(STL)类型,所以需要包含头文件
#include <string>
但是它也在万能头<bits/stdc++.h>中,所以用了万能头就不用引入<string>啦。
string的定义
string的定义分为6种形式,但是如果你理解透彻了,你就会发现其实他们都是差不多的
代码形式 | 含义 |
---|---|
string s1; | 初始化一个新string叫做s1,并将其初始化成一个空串 |
string s2(s1) | 创建一个string对象叫做s2是s1的副本,被称为直接初始化 |
string s2 = s1 | 同上一个,不过是拷贝初始化 |
string s1("data") | 创建一个string对象叫做s1是"data"这个字面量的副本,被称为直接初始化 |
string s1 = "data" | 同上一个,不过是拷贝初始化 |
string s1(n, 'c') | 创建一个长度为n的string对象,其中每个字符都是‘c' |
我比较推荐前五种,最后一种很容易把两个参数写反,又要一堆的调试时间,还不如一个一个加
string的各种操作
1)输入输出
string很方便,提供了<<以及>>运算符可以通过istream或ostream输入输出
注意,它碰到一个空格就结束读取了
比如可以这样
string s;
cin >> s;
cout << s << endl;
光光从这一点,就足以让我们从C风格改用string了。
还有就是string提供了一个好东西:getline()
这个函数的作用是从标准输入流中读入一整行再存到一个字符串里(没有换行符)
语法如下
getline (/*istream对象*/ , /*存放结果的string*/);
2)各种函数
string有两个比较常用的函数,分别是empty和size,他们的作用分别是判断string是否为空以及string的大小
语法如下
s.empty() // 返回一个bool内容是s是否为空
s.size() // 返回一个string::size_type,其实就是一个无符号整数,代表s所包含的字符个数
3)各种操作符
string有几种操作符
No.1 []
中括号我们再熟悉不过了,就是下标运算符,用法跟数组与vector一毛一样,我就不废话了
No.2 +
加号与我们整数的加法有很大区别,string的加法就是返回一个把后面的字符追加的前面的字符的后面的字符串,其实就是把俩字符串拼在一起
No.3 == 与 !=
这个很好理解,就是判断两个字符串是不是一毛一样
No.4 < > <= >=
这个跟vector一样,就是按字典序比,注:字符之间的比较比的是ASCLL码
其他
关于其他的就是+=,s += s1 就等同于s = s + s1,没什么好废话的
答案
好了,我们就来解决上面那个问题,就是建一个vector<string>,其他的就还是先输入,再遍历vector输出
#include <iostream>
#include <vector>
#include <string> // 注意不要漏了
using namespace std;
int main() {
vector<string> things;
string t; // 用来存储名字
while (cin >> t) {
things.push_back(t); // 加入操作
}
for (string i : things) { // 范围for循环,C++11新特性
cout << i << endl; // 输出
}
return 0;
}
OK,那我就讲到这里,我们下次再见咯。^_^