目录
- 输入输出
- 输入单个数字 or 字符
- 输入单行数列
- 输入单行字符串
- 输入多行符号列,已知行数和列数
- 字符串处理
- 删除字符串中的某个字符 / 子串
- find()
- erase()
- 输入字符串并分割到 vector\<string> 中
- getline()
- stringstream
- 示例
- 快速排序
- 其他
输入输出
输入单个数字 or 字符
- 描述:输入单个数字或字符
- 输入示例
5
2
a
b
int n, m;
char x, y;
cin >> n;
cin >> m;
cin >> x;
cin >> y;// 验证输出
cout << n << ' ' << m << ' ' << x << ' ' << y << endl; // 5 2 a b
输入单行数列
- 描述:单行数列,且不清楚数列个数,空格或逗号分割
- 输入示例 1:5 4 3 2 1 10
- 输入示例 2:5,4,3,2,1,10
void SingleLineOfNum() {vector<int> nums;int temp;while (cin >> temp) {nums.push_back(temp);if (cin.get() == '\n') break; // 对逗号的读取发生在这里,读取后就丢弃了}// 验证输出for (auto n : nums) {cout << n << " "; // 均输入 5 4 3 2 1 10}
}
【注】cin
默认丢弃空格,tab 这些分隔符
输入单行字符串
- 描述:单行字符串,且不清楚数列个数,空格或逗号分割
- 额外头文件
<string>
:string<sstream>
:stringstream,原理请见下方字符串章节
- 输入示例 1:zhang lili mengmeng
- 输入示例 2:zhang,lili,mengmeng
void SingleLineOfString() {string str;string temp;vector<string> res;getline(cin, str);stringstream ss(str);// while (getline(ss, temp, ' ')) { // 针对空格分隔符while (getline(ss, temp, ',')) { // 针对逗号分隔符res.push_back(temp);}// 验证输出for (auto r : res) {cout << r << " "; // 均输出 zhang lili mengmeng}
}
输入多行符号列,已知行数和列数
- 描述:程序先输入
m
,n
表示m
行数列,每行n
个数字,字符,字符串。接着程序输入具体的内容
// 输入示例 1,数字 + 空格分割
3 3 // 第一个 3 表示一共三行数列,第二个 3 表示每行数列有 3 哥元素
1 2 3
4 5 6
7 8 9// 输入示例 2,字符 + 逗号分割
3 3
zhang,lili,mengmeng
wang,guo,qiqi
xu,coco,siri
void MultipleRowAndCol() {int row, col;// 先输入行和列的数量cin >> row;cin >> col;vector<vector<int>> res(row, vector<int>(col, 0)); // 初始化一个二维的 vectorfor (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {cin >> res[i][j];}}// 验证输出// 1 2 3// 4 5 6// 7 8 9for (int i = 0; i < row; ++i) {for (int j = 0; j < col; ++j) {cout << res[i][j] << " ";}cout << endl;}
}
- 描述:另一种情况是,数列通过逗号分隔,而非上述的空格分割。思路也很简单,我们把逗号也视为数列的一部分,但是在输入时,不将逗号输入进
vector
中
字符串处理
删除字符串中的某个字符 / 子串
find()
函数原型:针对 string
类型时
size_t find (const string& str, size_t pos = 0) const noexcept;
描述:该函数可以返回要查找的标志符的下标(下标从 0)开始
erase()
函数原型:按删除长度 len
作为参数的函数原型
string& erase (size_t pos = 0, size_t len = npos);
描述:删除字符串指定位置字符以及之后 len 个字符
#include <iostream>
using namespace std;int main()
{string s = "I am a programmer.";int pos = s.find(".");cout << pos << endl; // 17s.erase(pos, 1);cout << s << endl; // I am a programmerreturn 0;
}
输入字符串并分割到 vector<string> 中
getline()
函数原型:
(1) istream& getline (istream& is, string& str, char delim);
(2) istream& getline (istream& is, string& str);
描述:该函数主要的作用是从输入流中提取字符然后将其存入字符串 string
中。
在下方的代码中,有两处使用到该方法。
第一处,我们用 getline
来从输入流中读取字符并存入字符串中,即 getline(cin, str);
第二处,我们利用 getline
来分割字符串,它的参数如下
- istream& is:在本例中我们用 stringstream 来对最开始的 string 进行类型转换
- string& str:它是每一次分割的子串缓冲区,在本例中用 temp 来表示
- char delim:分隔符
stringstream
描述:stringstream 是输入输出的字符串流对象,将字符串转换为字符串流,我们可以利用字符串流提供的多种功能操作字符串
示例
#include <iostream>
#include <sstream>
#include <string>
#include <vector>using namespace std;int main()
{string str;// 1. 输入字符串getline(cin, str);vector<string> res;// 2. 将字符串转换为字符串流stringstream input(str);string temp; // 子串缓冲区// 3. 设置分隔符const char delim = ' ';// 4. 分割字符串流,每个分割出来的子串放入 vector 中while (getline(input, temp, delim)) {res.push_back(temp);}// 【可选】5. 将 vector 中的子串重新拼接成完整字符串string out;for (int i = 0; i < res.size(); ++i) {out += res[i];if (i != res.size() - 1) out += " ";}cout << out << endl;return 0;
}
快速排序
- 描述:利用已有的 sort 函数,可以实现对容器中数列的快速排序,针对一些排序并非题目考察主要内容时,非常方便
- 额外头文件
<vector>
:vector<algorithm>
:sort
void ACMSort() {vector<int> arr = { 23, 21, 55, 100, 1, 3,45,78 };// sort(arr.begin(), arr.end()); // 默认从小到大sort(arr.begin(), arr.end(), greater<int>()); // greater 使得其可以从大到小排列// 验证结果for (auto a : arr) {cout << a << " ";}
}
其他
- 常见的整型最值
INT_MAX
(9,223,372,036,854,775,807,64 位下)
INT_MIN
(–9,223,372,036,854,775,808,64 位下)