实验四,stl学习

本文介绍了C++中的STL(标准模板库),包括其概念、主要容器如vector、list、deque、map、multimap、set和multiset的特点和使用场景。此外,还提到了STL中的算法、迭代器、仿函数和适配器等核心组成部分。通过实例展示了如何利用STL进行数据处理,最后总结了学习STL过程中遇到的问题和挑战。
摘要由CSDN通过智能技术生成

stl是什么有什么

stl是什么

STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。

stl有什么

容器

verctor

vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 [] 操作符,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。此外,当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。

list

list类似于c语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,因而它没有提供 [] 操作符重载。

deque

deque类似于C语言中的双向队列,即两端都可以插入或者删除的队列。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几。它支持两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率
也差不多。或者我们可以这么认为,deque是vector跟list的折中。

map

map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,这种特性了使得map类似于数据结构里的红黑二叉树。

multimap

multimap类似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。

set

set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。

multiset

multiset类似于数学里面的集合,集合中可以包含重复的元素。

以上内容引用了这里

C++中STL常用容器的区别 - 苍月代表我 - 博客园 (cnblogs.com)

算法

常用如sort,find,copy,for_each等

迭代器

扮演了容器和算法之间的胶合剂

仿函数

行为类似函数,可作为算法的某种策略

适配器

一种用来修饰容器或者迭代器接口的东西

空间适配器

负责空间的配置与管理

stl的简单实现

利用cevtor取反操作

#include <vector>
#include <iostream>
using namespace std;

int main()
{
	vector<int> v{ 1,2,3,4,5,6,7,8,9 };//简单定义一个

	for (auto& i : v)//取反操作
		i = -i;
	for (auto i : v)//输出
		cout << i << " ";

	cout << endl;

	for (auto& i : v) //平方操作
		i *= i;          
	for (auto i : v)     
		cout << i << " "; 
	cout << endl;

	return 0;
}

 

简单的set实现自定义类型操作

#include <iostream>
using namespace std;
#include<string>
#include<set>

class stu {//定义一个stu类
public:
    stu(int xvhao, string name)
    {
        this->M_Xv = xvhao;
        this->M_Na = name;
    }
    int M_Xv;
    string M_Na;
};

class comparestu {//!!!!这步很重要,你自定义类型时,set并不知道怎么排序,所以我们要搞个仿函数告诉他
public:
    bool operator()(const stu& s1, const stu& s2)const {
        return s1.M_Xv < s2.M_Xv;//用学号排序,从小到大
    }
};

void test() {

    set<stu, comparestu>s;//定义一个set容器叫做s
    stu s1(5026, "刘备");
    stu s2(5030, "关羽");
    stu s3(5028, "张飞");
    stu s4(5027, "国灰");//我的标志特征数据

    s.insert(s1);//简单输入一下
    s.insert(s2);
    s.insert(s3);
    s.insert(s4);

    for (set<stu, comparestu> ::iterator it = s.begin(); it != s.end(); it++)//输出一下
    {
        cout << "学号:" << it->M_Xv << "名字:" << it->M_Na << endl;
    }

    s.erase(s1);//删除操作

    cout << "删除后" << endl;
    for (set<stu, comparestu> ::iterator it = s.begin(); it != s.end(); it++)
    {
        cout << "学号:" << it->M_Xv << "名字:" << it->M_Na << endl;
    }


    set<stu, comparestu>::iterator iter;//查找操作
    iter = s.find(s2);
    cout << "查找结果为" << endl;
    if (iter != s.end()) {
        cout << (*iter).M_Xv << endl;
    }
    else {

        cout << "Cannot fine the student!" << endl;
    }
    

}



int main()
{
    test();
    system("pause");

    return 0;
}

 

map实现输入一串字符串后输出个数

#include<iostream>
#include<string>
#include<map>
using namespace std;

int main() {
	string str;
	map<char, int> map_s;
	while (cin >> str) {
		pair<map<char, int>::iterator, bool> ret;
		for (int i = 0; i < str.length(); ++i) {
			ret = map_s.insert(pair<char, int>(str[i], 1));
			if (ret.second == false) {//如果插入失败,则该迭代器的第一个参数的value++
				ret.first->second++;
			}
		}
		map<char, int>::iterator iter = map_s.begin();
		for (; iter != map_s.end(); iter++) {
			cout << iter->first << ' ' << iter->second << endl;
		}
		cout << endl;

	}
}

这个是应用了map表不能插入同一个数值的原理插入失败就加一,当然,很明显这不是我自己写的

 

总结

发现的问题

stl库的进展好像很慢,很多十年前的东西现在都可以用(没有革命性进展(好像),当然完整程度也很完整了),然后c++改语句也很迷,像2019const的修改。当然还是基础太差,在重载,引用和封装那块很吃力。努力课设做好点吧(估计也难)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值