实验四,stl学习

实验四,stl学习,第1张

实验四,stl学习 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 
#include 
using namespace std;

int main()
{
	vector 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 
using namespace std;
#include
#include

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() {

    sets;//定义一个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 ::iterator it = s.begin(); it != s.end(); it++)//输出一下
    {
        cout << "学号:" << it->M_Xv << "名字:" << it->M_Na << endl;
    }

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

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


    set::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
#include
#include
using namespace std;

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

	}
}

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

 

总结 发现的问题

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5635675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存