热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

容器__2018.05.25

1.使用迭代器去遍历容器,而不管迭代器底层数据的类型。2.cSTL。STL包含了、容器,空间配置器、泛型算法、类型萃取。memcpy内存拷贝

1.使用迭代器去遍历容器,而不管迭代器底层数据的类型。

2.c++STL。

STL包含了、容器,空间配置器、泛型算法、类型萃取。memcpy内存拷贝,二倍扩容。

insert

esreas

3.泛型算法:模板实现。只注重方法,不在乎类型。

泛型算法就是操作容器、迭代器的。

给迭代器提供,中括号运算符重载函数。直接通过下标访问元素。

泛型算法,只用迭代器。

typename 不仅可以定义类型,还可以告诉编译器,后面是类型。

写容器要注意:通用!!

听懂了,说不出来,跟不会一样。

提供排序的泛型算法,提供用户提供的自定义排序算法。

回调函数。

定义函数指针。template

看迭代器迭代的容器里是什么类型。

所谓所谓事件驱动就是回调函数,

事件驱动就是在事件发生之前就将事件的处理罗列出来。例如:

明天吃什么,我并不知道。但是我知道,不管我吃什么,我都会先拿一双筷子,搬个凳子,坐到那块。。。

不管吃什么,只要执行吃的操作都会固定执行这些操作。这就叫做事件驱动。

函数模板,


#include
#include
#include
#include
using std::cout;
using std::endl;template
class myallocator
{
public:// construct构造 destroy析构// allocate开辟内存 deallocate释放内存void construct(void *ptr, const T &val){new (ptr) T(val); //表示在ptr指向的内存,构造一个值为val的对象}void destroy(T *ptr){//自己填ptr->~T();}//开辟内存T* allocate(size_t size){//mallocreturn (T*)malloc(size);}//释放内存void deallocate(void *ptr){free(ptr);}
};template>
class Vector
{
public:typedef Vector _MyT;//默认构造的vector,底层没分配过内存0Vector() :mpVec(NULL), mSize(0), mCur(0){}//size表示初始的内存大小,val表示内存初始值Vector(int size, const T &val = T()):mSize(size), mCur(size){mpVec = _allocator.allocate(mSize * sizeof(T));for (int i = 0; i & operator=(const Vector &src){if (this == &src)return *this;for (int i = 0; i private:T *mpVec;int mSize;int mCur;Allocator _allocator;
};//函数模板,统一进行容器元素的遍历输出
template
void showContainer(Container &con)
{Container::iterator it &#61; con.begin();for (; it !&#61; con.end(); &#43;&#43;it){cout <<*it <<" ";}cout <}
//对first和last迭代器区间的所有元素&#xff0c;进行排序&#xff0c;默认小到大
/*
1.mysort这样的函数&#xff0c;参数都接收的是迭代器&#xff0c;这一类函数在C&#43;&#43; STL
里面&#xff0c;大概有70多种&#xff0c;它们统一叫什么名字&#xff1f;
2.把mysort代码写完&#xff0c;里面不能出现具体的类型&#xff08;int&#xff0c;vector&#xff09;
3.C&#43;&#43; STL里面也有一个&#xff08;&#xff09;叫做sort&#xff0c;它当然是用快排&#xff08;递归实现&#xff09;
1亿个整数处理的时候&#xff0c;如果sort只采用递归的快排&#xff0c;那么很可能出现栈溢出问题&#xff0c;
为了处理栈溢出的问题&#xff0c;sort做了哪些处理&#xff1f;
*/
template
void mysort(IteratorT first, IteratorT last)
{int size &#61; last - first; for (int i &#61; 0; i first[j&#43;1]){IteratorT::value_type tmp &#61; first[j];first[j] &#61; first[j &#43; 1];first[j &#43; 1] &#61; tmp;}}}
}
//重载的泛型算法mysort&#xff0c;提供用户自定义的排序方式
/*
请自行提供两个函数模板&#xff0c;分别比较数据的>和<&#xff0c;并且在main函数中调用一下
该mysort重载版本&#xff0c;分别对容器的元素进行小到大&#xff0c;大到小的排序并且打印出来
事件驱动&#xff1a;逆置了事件的处理和事件发生的时间
*/
template
bool greaterFunc(T a, T b)
{return a > b;
}template
void mysort(IteratorT first, IteratorT last,FUNC pfunc)
{int size &#61; last - first;for (int i &#61; 0; i }int main(int argc, char* argv[])
{Vector vec1;srand(time(0));for (int i &#61; 0; i <20; &#43;&#43;i){vec1.push_back(rand() % 100);}showContainer(vec1);//默认从小到大排序 vector::iterator list::iteartormysort(vec1.begin(), vec1.end());showContainer(vec1);//大到小排mysort(vec1.begin(), vec1.end(), greaterFunc);//打印输出showContainer(vec1);//小到大牌//打印输出/*需要一种通用的方式&#xff0c;来遍历任何的容器 operator[]做不到的通用&#xff1a; 怎么通用&#xff1f;是使用方式通用呢&#xff1f;还是所有容器共用一个迭代器呢&#xff1f;数组operator[]链表二维数组哈希表红黑树迭代器和容器是一一对应的&#xff0c;所以在设计上&#xff0c;把迭代器这个类&#xff0c;设计成容器类型的嵌套类性*//*1.需要在容器里面定义嵌套类型 iterator2.给容器提供begin方法 iterator begin(); 把容器第0号位元素的迭代器返回回去3.给容器提供end方法 iterator end(); 把容器末尾元素后继位置的迭代器返回回去4.给迭代器提供operator!&#61;5.给迭代器提供operator&#43;&#43;()6.给迭代器提供operator*()Vector::iterator it &#61; vec1.begin();for (; it !&#61; vec1.end(); &#43;&#43;it){cout <<*it <<" ";}cout <::iterator it &#61; vec1.begin();for (; it !&#61; vec1.end(); &#43;&#43;it){if (*it % 2 &#61;&#61; 0){// it.operator*()*it &#61; 0; //error C2106 : “ &#61; ” : 左操作数必须为左值}}showContainer(vec1);string str1 &#61; "hello world";string::iterator it2 &#61; str1.begin();for (; it2 !&#61; str1.end(); &#43;&#43;it2){cout <<*it2;}cout <}

函数不能进行内联&#xff0c;因为在编译时&#xff0c;只通过函数指针并不能确定调用的是哪个函数。

效率太低&#xff0c;无法内联。哪怕函数指针指向的是内联函数&#xff0c;也不能做内联处理。

在c&#43;&#43;中使用函数指针存在的两个问题。

1.效率太低&#xff0c;无法内联。

2.函数函数局部作用域。无法对这些信息进行封装和隐藏。

事件驱动&#xff1a;在事件还没发生之前就将事件发生后需要执行的方法定义好了&#xff0c;只要事件发生了就执行相应的函数方法。

解决&#xff1a;目标

我要能够内联。

类的名字首字母大写。

小括号又叫函数调用运算符。


主要用在泛型算法中&#xff0c;扩展泛型算法功能。

因为提供了对象的圆括号运算符重载函数。所以它直接调用的是对象的圆括号运算符重载函数。

那都不差&#xff0c;就差在学习方法上。

不能死记硬背&#xff0c;死记硬背在面试官面前连一程都撑不下来。

泛型算法主要针对容器。

排序&#xff0c;对函数功能进行扩展。

方法有问题。

改个类型名字。

传引用进来&#xff0c;避免了临时对象的构造和析构。



推荐阅读
  • 题目《BZOJ2654: Tree》的时间限制为30秒,内存限制为512MB。该问题通过结合二分查找和Kruskal算法,提供了一种高效的优化解决方案。具体而言,利用二分查找缩小解的范围,再通过Kruskal算法构建最小生成树,从而在复杂度上实现了显著的优化。此方法不仅提高了算法的效率,还确保了在大规模数据集上的稳定性能。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • Codeforces 605C:Freelancer's Dreams —— 凸包算法解析与题解分析 ... [详细]
  • 题目链接: Caninepoetry问题概述:给定一个仅包含小写字母的字符串,允许将任意位置的字符修改为任意其他小写字母。目标是通过最少次数的修改,使字符串中所有长度大于1的子串均满足特定条件。本文详细分析了该问题,并运用思维与贪心算法,提出了一种高效解决方案。通过对字符串的深入解析,我们探讨了如何在最小化修改次数的同时,确保所有子串符合要求。 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • Codeforces竞赛解析:Educational Round 84(Div. 2评级),题目A:奇数和问题
    Codeforces竞赛解析:Educational Round 84(Div. 2评级),题目A:奇数和问题 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 作文记录:合并区间的技巧与应用
    本文详细记录了合并区间问题的解题技巧与应用场景。首先介绍了问题背景和题目描述,接着从排序最大值的角度探讨了解决思路,并提供了具体的程序代码及运行结果。此外,还探讨了其他可能的解决方案。最后,对整个解题过程进行了总结,为读者提供了全面的理解和参考。 ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
  • 本文探讨了基础二分法在数据报告生成中的应用及其优化策略。通过分析二分法在处理大规模数据集时的高效性和准确性,提出了若干改进措施,以提升数据报告的生成速度和质量。具体包括算法的并行化处理、数据预处理技术的应用以及异常值的处理方法,旨在为数据分析师提供更为高效和可靠的工具。 ... [详细]
  • 本报告对2018年湘潭大学程序设计竞赛在牛客网上的时间数据进行了详细分析。通过统计参赛者在各个时间段的活跃情况,揭示了比赛期间的编程频率和时间分布特点。此外,报告还探讨了选手在准备过程中面临的挑战,如保持编程手感、学习逆向工程和PWN技术,以及熟悉Linux环境等。这些发现为未来的竞赛组织和培训提供了 valuable 的参考。 ... [详细]
  • 链栈虽然通常以数组作为底层实现,但也可以采用链表来构建Stack类。在这种情况下,空堆栈通过NULL指针表示。当新元素被压入堆栈时,它会被添加到链表的头部,从而实现高效的入栈操作。此外,出栈操作则通过移除链表头部的节点来完成,确保了操作的时间复杂度为O(1)。这种设计不仅简化了内存管理,还提高了动态数据处理的灵活性。 ... [详细]
author-avatar
手机用户2502913623
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有