今天继续练习C++和ACM模式
在写题之前先了解一些新的知识
1.#include <algorithm>
`#include <algorithm>` 是 C++ 标准库中的头文件之一,其中包含了一系列用于处理各种容器(如数组、向量、列表等)和其他数据结构的算法。这个头文件提供了多种常用的算法,包括排序、查找、删除等,以及一些用于操作迭代器的函数。
以下是一些 `algorithm` 头文件中常用的函数:
1. **排序算法:**
- `std::sort(begin, end)`:对范围 `[begin, end)` 的元素进行排序。
- `std::stable_sort(begin, end)`:稳定排序,保留相等元素的相对顺序。
2. **查找算法:**
- `std::find(begin, end, value)`:在范围 `[begin, end)` 中查找值为 `value` 的元素,返回指向该元素的迭代器。
- `std::binary_search(begin, end, value)`:在已排序的范围 `[begin, end)` 中二分查找值为 `value` 的元素。
3. **删除和修改算法:**
- `std::remove(begin, end, value)`:从范围 `[begin, end)` 中删除所有值为 `value` 的元素,返回指向删除后范围末尾的迭代器。
- `std::replace(begin, end, old_value, new_value)`:将范围 `[begin, end)` 中所有值为 `old_value` 的元素替换为 `new_value`。
4. **其他算法:**
- `std::max_element(begin, end)`:在范围 `[begin, end)` 中找到最大元素的迭代器。
- `std::min_element(begin, end)`:在范围 `[begin, end)` 中找到最小元素的迭代器。
这些算法提供了一种方便且高效的方式来操作和处理各种数据结构。通过 `#include <algorithm>`,你可以在程序中使用这些算法,而不必自己实现它们。
2.第一题
输入两行,第一行是n,第二行是n个字符,每个字符之间使用空格隔开,然后输出的是一个已经排好序的字符串。ok开干
代码如下:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int n;
// 获取n的值
cin >> n;
// 创建一个字符串数组记录所有的字符串
vector<string> result(n);
// 存入字符串
for(int i = 0; i < n; i++){
cin >> result[i];
}
//因为要的是排序好的字符串,所以我们再进行排序
sort(result.begin(), result.end());
//输出字符串
for(int i = 0; i < n; i++){
cout << result[i];
// 但是记住要添加空格
if(i < n - 1){
cout << " ";
}
}
return 0;
}
呃,头文件有些是不需要使用的,但是我现在就学了这么几个,所以就有几个放几个啦嘿嘿
3.第二题
这里相对于上一题就没有给出明确的判断循环结束的条件了,但是仍然也是不影响,这种情况昨天已经遇到过了,直接拿下
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
vector<string> result;
string one;
// cin >> one这个写法就是,只要没有到Null就一直循环
while(cin >> one){
// 二话不说直接放入字符数组
result.push_back(one);
// 如果是换行符
// 那么到这里这一行就结束了
if(cin.get() == '\n'){
// 先将数组进行排序处理
sort(result.begin(), result.end());
// 然后进行输出
for(int i = 0; i < result.size(); i++){
cout << result[i];
if(i < result.size() - 1){
cout << " ";
}
}
// 然后记得换行
cout << endl;
// 最后记得清除数组元素
result.clear();
// 然后跳过这次循环
continue;
}
}
return 0;
}
说是直接拿下,但是在这里我和 cin.get()方法周旋了好久
我一直不明白为什么我前面已经把 \n换行符加进去了,为什么还需要后面自己手动换行
那么我就做了很多测试,最后通过如下代码测试出来了。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<string> result;
string one;
// cin >> one这个写法就是,只要没有到Null就一直循环
while (cin >> one) {
// 二话不说直接放入字符数组
cout << one << "我是one" <<endl;
result.push_back(one);
// 如果是换行符
// 那么到这里这一行就结束了
char get = cin.get();
cout << "B" << get << "E" << endl;
if ( get == '\n') {
cout << "换行了";
// 先将数组进行排序处理
sort(result.begin(), result.end());
// 然后进行输出
for (int i = 0; i < result.size(); i++) {
cout << result[i];
if (i < result.size() - 1) {
cout << " ";
}
}
// 然后记得换行
cout << endl;
// 最后记得清除数组元素
result.clear();
// 然后跳过这次循环
continue;
}
}
return 0;
}
然后输出的样子是这样的、
我输入了 a空格b空格c
你会发现 cin.get()每次读取的都是已经读取之后的下一个元素,这就是为什么\n没了需要自己手动的添加,get()方法会将它消耗掉,所以你可以采用peek()方法,但是由于并没用将cin.peek()这个方法的数据添加到数组里,所以还是要自己手动添加。这个问题到这里就完美的结束了。
欧耶\(^o^)/
欧耶\(^o^)/
欧耶\(^o^)/
欧耶\(^o^)/
欧耶\(^o^)/
4.第三题
使用逗号隔开其实也差不多,但是由于C++的输入法则 “,” 是没有办法变成输入的隔开符号的,所以就只能采用读取一行,然后根据 逗号 隔开的方法来操作了
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std;
int main(){
vector<string> result;
string line;
// 直接读取一行文字
while(getline(cin, line)){
// 放入字符串流
stringstream strLine(line);
// 用于存储每个单词
string word;
// 通过 ‘,’分割
while(getline(strLine, word, ',')){
result.push_back(word);
}
// 排序
sort(result.begin(), result.end());
// 输出排序之后的结果
for(int i = 0; i < result.size(); i++){
cout << result[i];
if(i < result.size() - 1){
cout << ",";
}
}
// 记得换行
cout << endl;
// 记得清空数组
result.clear();
}
return 0;
}
结束了
这几天的突击基础训练就这样结束了,说实话,基本上算是基础的过渡到C++了,已经貌似,好像可以摆脱使用Java写算法的痛苦了。ok
ヾ( ̄▽ ̄)Bye~Bye~