【教程】ACM 模式输入输出 C++

目录

  • 输入输出
    • 输入单个数字 or 字符
    • 输入单行数列
    • 输入单行字符串
    • 输入多行符号列,已知行数和列数
  • 字符串处理
    • 删除字符串中的某个字符 / 子串
      • find()
      • erase()
    • 输入字符串并分割到 vector\
      • getline()
      • stringstream
      • 示例
  • 快速排序
  • 其他

输入输出

输入单个数字 or 字符

  1. 描述:输入单个数字或字符
  2. 输入示例
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. 描述:单行数列,且不清楚数列个数空格或逗号分割
  2. 输入示例 1:5 4 3 2 1 10
  3. 输入示例 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 这些分隔符

输入单行字符串

  1. 描述:单行字符串,且不清楚数列个数空格或逗号分割
  2. 额外头文件
    1. :string
    2. :stringstream,原理请见下方字符串章节
  3. 输入示例 1:zhang lili mengmeng
  4. 输入示例 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
	}
}

输入多行符号列,已知行数和列数

  1. 描述:程序先输入 mn 表示 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)); // 初始化一个二维的 vector

	for (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 9
	for (int i = 0; i < row; ++i) {
		for (int j = 0; j < col; ++j) {
			cout << res[i][j] << " ";
		}
		cout << endl;
	}
}
  1. 描述:另一种情况是,数列通过逗号分隔,而非上述的空格分割。思路也很简单,我们把逗号也视为数列的一部分,但是在输入时,不将逗号输入进 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 
using namespace std;

int main()
{
    string s = "I am a programmer.";
    int pos = s.find(".");
    cout << pos << endl; // 17
    s.erase(pos, 1);
    cout << s << endl;   // I am a programmer

	
	return 0;
} 

输入字符串并分割到 vector

getline()

函数原型:

(1) istream& getline (istream&  is, string& str, char delim);
(2) istream& getline (istream&  is, string& str);

描述:该函数主要的作用是从输入流中提取字符然后将其存入字符串 string 中。

在下方的代码中,有两处使用到该方法。

第一处,我们用 getline 来从输入流中读取字符并存入字符串中,即 getline(cin, str);

第二处,我们利用 getline 来分割字符串,它的参数如下

  1. istream& is:在本例中我们用 stringstream 来对最开始的 string 进行类型转换
  2. string& str:它是每一次分割的子串缓冲区,在本例中用 temp 来表示
  3. char delim:分隔符

stringstream

描述:stringstream 是输入输出的字符串流对象,将字符串转换为字符串流,我们可以利用字符串流提供的多种功能操作字符串

示例

#include 
#include 
#include 
#include 

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;
}

快速排序

  1. 描述:利用已有的 sort 函数,可以实现对容器中数列的快速排序,针对一些排序并非题目考察主要内容时,非常方便
  2. 额外头文件
    1. :vector
    2. :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 << " ";
	}
}

其他

  1. 常见的整型最值
    INT_MAX(9,223,372,036,854,775,807,64 位下)
    INT_MIN(–9,223,372,036,854,775,808,64 位下)

你可能感兴趣的:(c++,算法,数据结构)