C++ STL开发温习与总结(一): 1.C++编程技术

简介: C++ STL开发温习与总结(一): 1.C++编程技术

若该文为原创文章,转载请注明原文出处

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/77905737

长期持续带来更多项目与技术分享,咨询请加QQ:21497936、微信:yangsir198808

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中...

其他(编程相关)

上一篇:没有了

下一篇:C++ STL开发温习与总结(二): 2.C++存储技术

 

前言

使用了多年C++,没有系统的温习总结过,所以准备温习《C++STL程序员开发指南》,本系列篇章将会是温习总结该书本概念和技术点。

 

1概论

l  C++语言是基于C语言的语法基础上融入了其他语言中许多独特的语法特定之后而形成的全新的语言体系。

l  C++与C语法结构几乎一致且多数编译器可单独编译和混编(商业需求),很大程度上使读者误以为C++语言是C语言的改进型语言。

l  C++语言,类(Class)是核心。

l  本篇章主要介绍C++的关键语法,分析C++的许多内核技术。

 

2 C++与C语言的区别

     C语言提供:宏、指针、结构、数组和函数;

     C++语言提供:宏、指针、结构、数组和函数,此外还有私有和保护性成员、函数重载、缺省参数、构造和析构函数、自定义操作符、内联函数、引用、友元、模版、异常、命令空间等。

     C是C++的子集,但是C是面向过程,C++是面向对象。

2-1文件扩展名的改变

     C语言体系使用“.c”;

     C++语言体系使用“.cpp”(即CPlus-Plus);

     C和C++头文件一般仍用“.h”,有些操作系统规定使用“hpp”。

2-2简化输入/输出手段

C语言,输入/输出本是依靠函数来实现(如scanf、printf等),头文件声明“#include<stdio.h”;

C++语言另外定保留字和运算符来替代C语言中对标准输入/输出函数的引用,头文件声明 “#include<iostream.h>”(标准IO流),C++语言的保留字为:

cout<<”输出内容”<<…; /* 为标准输出算符(默认为显示器)*/
cout>>”输入内容”>>…; /* 为标准输入算符(默认为键盘) */

2-3数据类型声明的改变

     C++语言新增了类(Class)类型,继承了C语言所支持的所有数据类型。但C++在数据类型的声明上作了两种较大的改变:

l  允许数据类型的声明语言可以出现在程序的任何位置;

l  允许直接使用结构体名定义实体。

structDt {  unsigned int mm, dd, yy; };
Dtdt[3];

2-4动态内存分配运算符的使用

     C++与C语言相比,允许进行动态内存分配,使用new和delete,这是一对真正的运算符,无须任何函数支持(即由C++语言编译器直接处理)。

     new运算符的功能等效于C语言中的malloc一类的函数功能。

     指向对应类型的指针 = new 类型描述符;      

int*p; 
p =new int;  // 仅占用一个机器字长空间
int*p2;
p2 =new int(20);  // 仅占用一个机器字长且赋初值
int*p3; 
p3 =new int[20];  // 占20个机器字长单元

(机器字长:机器字长是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点运算)。

     delete 指针名;

如果指针是数组,可以加上“[ ]”表示,即

     delete [n]指针名;

/* 为标准输出算符(默认为显示器)*/

     cout>>”输入内容”>>…; /* 为标准输入算

l  执行new运算符的操作通常按堆栈的存取方式由后向前安排。

l  释放new出的变量a和b后,当重新分配a[n]时(n>1),由于前一个a指向一个字长的空间,第二次要求n个单元的分配,只得另辟空间,此种分配便会造成至少一个字长的内存空洞浪费,这种空洞浪费被称为内存碎片的一种形态,是C++语言程序在运行时容易造成的一种不良现象。

2-5引用(References)类型

     这是C++语言的一个特殊的数据类型描述,用于在程序的不同部分使用两个以上的变量名指向同一地址,使得其对任一个变量的操作实际上都是对同一个地址单元进行的。在这种两个以上变量名的关系中,被声明为引用类型的变量名被称之为实变量名的别名。语法如下:

     类型名 & 引用型函数名或变量名 = 前已声明的(常)变量名;

       int i =0;
       int &j = i;
       j = 1;

2-6对const语义的扩展

l 一般常量

     在c语言中,const保留字是作为声明常数数据类型的附加类别标识使用的,被声明的常数必须到程序执行后才能被访问,则在C++语言中,则允许被声明的常数在后续的编译中被直接访问,如下面:

      const inti = 9;

      char t[i];  // 等效于 char[9];  但是此句在c语言编译时报错。

     <类型说明符> const <数组名>[<大小>] … 或者

     const<类型说明符> <数组名>[<大小>] …

     <类名> const <对象名> 或者

     const <类名> <对象名>

l 指针和常引用

使用const修饰指针时,由于const的位置不同而含义不同。

       char *const ptr1 = sringptr1;  // 指向字符变量的常指针
       charconst * ptr2 = “xxx”;  // 指向常量的指针

l 常成员函数

使用const关键字进行说明的成员函数,成为常成员函数。只有常成员函数才有资格操作常量或者常对象,没有使用const关键字说明的成员函数不能用来操作常对象。常成员函数说名格式如下:

<类型说明符> <函数名>(<参数表>) const;

      如R类中有voidprint()和void print()const;

 

       R a;
       const Rb;
       a.print();  // 调用 void print()
       b.print();  // 调用 void print() const

 

l 常数据成员

     类型修饰符const不仅可以说明成员函数,也可以说明数据成员。由于const类型对象必须被初始化,并且不能更新,因此,在类中说明了const数据成员时,只能通过成员初始化列表的方式来生成构造函数对数据成员初始化。

.h文件中:

class A { …
       A(inti);
       constint &r;
       constint a;
       staticconst int b;
…}

.cpp文件中:

const int A::b=10;
A::A(int i):a(i),r(a) {  }

2-7指针声明类型与对象类型相一致

     在C语言中,指针声明时的类型与其所指向的数据实体的类型可以不一致(借助C语言内定的缺省类型转换技术);

     在C++语言中,指针声明时的类型与其所指向的数据实体的类型必须一致。

       void*f;  // 空指针
       inti=1,*p;
       f =&i;
       p=(int*)f;  // C++语言不能通过缺省将非int类型的地址赋值p,只能(int*)强制转换
       f=p;
       cout<< “p is “ << p << *p;
       count<< “f is “ << f << *f;  // void的值不能显示,故编译报错。

2-8 int与char不再等价

     在C语言中,char类型(’A’)同int类型同样占用2B的空间(假设机器字长为16位),所以有时认为两者可以等价。

     在C++语言中,’A’类型的长度计量真正成为按单字节为单位计算了。

     所以在使用时,sizeof(‘A’)的值为1,而sizeof(65)的值为2,两者不一致。

注意:在实际和其他教程中,c语言中的char类型一直是1B。2-8这点存在疑问。

2-9 结构数据类型的变化

     在C语言中,struct声明一般是同对其操作的程序代码相分离的。

     在C++语言中,允许对结构体的数据成员进行操作的函数也作为其成员在struct内矛以声明。C++举例代码片段:

#include <iostream.h>
struct Dt
{
       unsignedint yy,mm,dd;
       voiddsp() {cout<<yy<<’.’<<mm<<’.’<<dd<<endl;}
}
void main()
{
       Dt d;
       d.yy=2002;
       d.mm=8;
       d.dd=1;
       d.dsp();
}

     C++语言的struct正式后面要讲的class声明的一个特例,类的概念也由此引出。要强调的另一点是在C++语言中含有成员函数原形声明的struct必须作为全局结构安排。因为C++不支持局部函数嵌套的声明结构。

2-10数据和指针技术的不同

     在C中,一个数组只是一篇存储区域。例如:

       intv[10];  // 10个int型变量的数组
       v[3] =1;  // 将1赋值给v[3]
       int x= v[3];  // 从v[3]读取元素值

     在C中,一个指针是指一个变量,它存放着某个存储位置的地址。例如:

       int*p;  // p是一个指向int型对象的指针
       p =&v[7];  // 将v[7]的地址赋值给p
       *p =4;  // 通过p来向v[7]写入数据
       int y= *p;  // 通过p来读取v[7]的数据

     指针的标记*用在声明中,表示声明的对象是指针;用在表达式中,表示取指针所指向的那个元素。

     C++引借了C的这种颇为简单的、与机器结构极为近似的存储方案,同时也引借了C在表达式、控制结构以及函数等方面所使用的方案。

       int*find(int v[], int vsize, int val)  //在v中查找val
       {
              for(intI = 0; I < vsize; i++)  // 从0到vsize-1的循环
                     if(v[i] == val) return &v[i];  // 如果找到val,就返回指向元素的指针
              return&v[vsize];  // 如果没找到,就返回v末端元素的指针
       }

     对于诸如find()这样的函数,C++标准程序库提供了更为通用的函数版本。

 

上一篇:没有了

下一篇:C++ STL开发温习与总结(二): 2.C++存储技术

 

若该文为原创文章,转载请注明原文出处

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/77905737


相关文章
|
6月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
167 2
|
6月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
318 73
|
7月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
6月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
256 3
|
7月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
318 1
|
8月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
175 21
|
8月前
|
IDE 开发工具 C语言
C++一分钟之-嵌入式编程与裸机开发
通过这些内容的详细介绍和实例解析,希望能帮助您深入理解C++在嵌入式编程与裸机开发中的应用,提高开发效率和代码质量。
198 13
|
7月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
9月前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
182 1
|
9月前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
279 7