前言
开设新的专栏了,之前刷Codewars的时候经常性的使用一些stl里面的一些功能,也可以多多少少掌握一些比较方便的用法。但是,仅仅是对一些简单用法的掌握,缺乏系统的学习,是远远无法胜任之后更复杂的要求。灵感来源于积累,而灵感的出现就是知识网络中相互联系的知识产生共鸣。而要使我们的灵感可以更多的涌现,需要我们的知识网络更加严密,仅仅是碎片化的学习是远远不够的。这就是今天要来开始系统学习STL的原因。(另外:博主是老九学堂的学生,本博文许多知识来源于老九学堂的Qt框架课,所以在这给老九打波广告吧)
话不多说,开始关于STL的学习。
内容
STL是什么?
STL全称为standard template library,中文名叫做标准模板库,由当年惠普实验室开发的一系列软件统称,目的是借助模板,实现数据结构与算法的功能。为我们的编程带来了极大的便利,并被纳为了C++的一部分,它由标准C++的I/O库、容器和迭代器库和算法库组成,包含一组宏、函数类型和对象声明组成。
内部使用对象学习
I/O对象的使用——与C++基础一样故不再赘述
文件的I/O使用方式
下面展示一些 。
方式一
#include <iostream>
#include <fstream> //引入此头文件
using namespace std;
int main()
{
auto _IO_file = []() {
ifstream file1("E:\\Programs\\school test 3\\main.cpp");
//打开文章用于读,若文件不存在则创建文件
ofstream file2("copy_lbt.cpp");
//打开文章用于写,若文章不存在则创建文件,若文件存在则清空文件内容
string str;
string content;
while (getline(file1,str)) {
//getline函数从输入流file1中截取字符直到出现回车,并在无法继续截取时返回0(假)
file2 << str << '\n';
//发现可以直接将字符串通过输出流输出到新文件中
content += str + '\n';
//字符串通过加法的拼合
}
cout << content << endl;
};
_IO_file();
}
这样的执行结果为:我们通过执行这个程序,读取了其本身的源代码,并利用字符串的拼接还原打印出了此源代码。同时,我们又输出了一个名为copy_lbt的文件,将我们的源代码输出到了这个新建的文件里面。
这个就是文件流的一个操作展示。
方式二
#include <iostream>
#include <fstream> //要引入此头文件
using namespace std;
int main(int argc, char* argv[])
//这里由操作系统传来两个参数argc与argv,argv为指针的指针,argc为整数
/**
* 假设程序名称为program
* argc = 1,表示只有一个程序名称,argv[0]指向输入的程序路径及名称
* 输入prog para_1 para_2时有两个参数
* argc = 3,表示除了程序名外还有两个参数
* argv[0]指向程序名称,argv[1]指向参数para_1字符串,argv[2]指向para_2字符串
*/
{
//声明一个process函数
auto process = [](ifstream& input) {
//声明一个字符串
string content;
while (input >> content)
{
cout << content << endl;
}
};
//再次声明一个函数
auto showFIleTwo = [argc,argv,process]() {
//接受磁盘上被读取的文件
for (char** param = argv + 1; param != argc + argv; param++)
{
//声明一个输入流对象
ifstream input(*param); //这里的*param就是程序参数的地址
if (input) //判定是否能打开文件
{
process(input);
} else{
cerr << "不能打开文件:" << string(*param);
}
//关闭文件流
input.close();
}
};
showFIleTwo();
return 0;
}
文件字符串流的使用方式
#include <iostream>
#include <fstream> //要引入此头文件
#include <vector>
#include <sstream>
using namespace std;
int main(int argc, char* argv[])
{
struct PersonInfo {
string name;
vector<string> phones;
};
//声明一个format函数
auto format = [](const string& s)->string { //lambda表达式,就是以s为传入参数,返回string类型
return s;
};
//声明一个valid
auto valid = [](const string& content)->bool {
return true; //直接返回true不具体讨论,目前还没学
};
//声明一个函数
auto getData = [](istream& input)->vector<PersonInfo> {
//声明两个字符串变量
string line, word;
//声明一个集合对象
vector<PersonInfo> people;
//循环读取信息
for (int i = 0; i < 3; ++i) {
//从控制台读取一行信息
getline(input, line);
//声明一个PersonInfo对象封装输入的信息
PersonInfo data;
//声明一个字符串流
istringstream record(line);
//读取信息
record >> data.name;
//读取电话号码
while (record >> word)
{
data.phones.push_back(word);
}
//把对象放到容器中
people.push_back(data);
}
//返回集合
return people;
};
//在书写一个函数
auto stringProcess = [valid,format](ostream output, vector<PersonInfo> people)->ostream& {
for (vector<PersonInfo>::const_iterator entry = people.begin();
entry != people.end(); entry++) {
//声明两两个输出流
ostringstream formatted, badNumbers;
//循环电话号码
for (vector<string>::const_iterator numbers = entry->phones.begin();
numbers != entry ->phones.end(); numbers++){
//判定
if (!valid(*numbers)){
badNumbers << " " << *numbers;
} else {
formatted << " " << format(*numbers);
}
}
//再判定一下
if (badNumbers.str().empty())
output << entry->name << " " << formatted.str() << endl;
else
cerr << "输入错误:" << entry->name << "非法的电话号码:"
<< badNumbers.str() << endl;
}
return output;
};
stringProcess(cout, getData(cin));
return 0;
}
结尾
I/O部分的学习就差不多了,其中其实还涉及了很多知识点
如:函数的lambda表达式,系统参数argc与argv[],vector容器类的操作和迭代器的使用,还有I/O的很多灵活操作,需要好好消化才能比较好的理解所学的这部分内容。目前有一些无法很好的理解十分正常,就是不要死磕,可以先往后面去学习,再回过头来重新回顾,很多比较难懂的就会融汇贯通。
之后会交叉更新Codewars上面的认为好的题目,以及STL的学习。emmm。。。大概就是这样吧。