C++ STL编程学习(一)

前言

开设新的专栏了,之前刷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。。。大概就是这样吧。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值