当前位置: 首页 > news >正文

怎样创建网站视频网站站内链接

怎样创建网站视频,网站站内链接,百度知道提问,做电商运营要什么条件1.static的使用 1#xff09;修饰局部变量#xff1a;在函数内部使用static修饰局部变量#xff0c;会使它成为静态局部变量。静态局部变量只会被初始化一次#xff0c;且只有在第一次调用该函数时才会被初始化#xff0c;之后每次调用该函数时都会保留上一次的值.从原来…1.static的使用 1修饰局部变量在函数内部使用static修饰局部变量会使它成为静态局部变量。静态局部变量只会被初始化一次且只有在第一次调用该函数时才会被初始化之后每次调用该函数时都会保留上一次的值.从原来的栈区存放改为全局区。 2修饰全局变量在函数外部使用static修饰全局变量会使它成为静态全局变量。静态全局变量的作用域仅限于当前文件即只能在当前文件内被访问不能被其他文件访问。 3修饰成员变量在类中使用static修饰成员变量会使它成为静态成员变量。静态成员变量的生命周期与程序的生命周期相同即它只会被初始化一次且存在于所有类对象之外。静态成员变量在类内部声明在类外部需要进行定义和初始化。 4修饰成员函数在类中使用static修饰成员函数会使它成为静态成员函数。静态成员函数不依赖于任何类对象只能访问类的静态成员变量和静态成员函数不能访问类的非静态成员变量和非静态成员函数。静态成员函数通过类名来访问。 2.const的使用 1修饰变量变量的值不能改变 2修饰指针左定值常量指针右定向指针常量 3修饰成员变量const修饰成员变量只在某个对象的生命周期中是常量因为类可以创建多个对象不同的对象其const数据成员值可以不同。所以不能在类的声明中初始化const数据成员因为类的对象还没有创建时编译器还不知道const数据成员值是多少。所以只能在类的构造函数的初始化列表中初始化。 4修饰成员函数可以使用类中的所有成员变量但是不能改变他们的值。 3.指针常量常量指针常指针常量 1指针常量可以改变指针指向的值但是不能改变指针的指向 2常量指针可以改变指针的指向但是不能改变指针指向的值 3常指针常量指针的指向和指向的值都不能改变 4.指针和引用的异同 相同点都可以对变量进行改变 不同点 1指针本质是一个变量需要分配内存引用是给一个对象起别名不需要分配内存 2引用在定义时必须初始化而指针可以不用初始化 3指针初始化可以为空但是引用必须是一个已有对象的引用 4指针和引用的自增运算结果不同。指针是指向下一个地址而引用是引用的变量值1 5Sizeof不同指针得到的是指针的大小引用得到的是引用变量的大小。 5.如何理解多态 定义同一操作作用于不同的对象产生不同的执行结果。C多态意味着当调用虚成员函数时会根据调用类型对象的实际类型执行不同的操作。 在日常生活中的多态例子买票时成人买票全价如果是学生那么半价如果是军人就可以优先买票。不同的人买票会有不同的实现方法这就是多态。 C的多态必须满足两个条件1 必须通过基类的指针或者引用调用虚函数 2 被调用的函数是虚函数且必须完成对基类虚函数的重写 实现通过虚函数实现用virtual声明的成员函数就是虚函数允许子类重写。声明基类的指针或者引用指向不同的子类对象调用相应的虚函数可以根据指针或引用指向的子类的不同从而执行不同的操作。 Overload重载函数名相同参数类型或顺序不同的函数构成重载。 Override重写派生类覆盖基类用virtual声明的成员函数。 Overwrite隐藏派生类的函数屏蔽了与其同名的基类函数。派生类的函数与基类函数同名但是参数不同隐藏基类函数。如果参数相同但是基类没有virtual关键字基类函数将被隐藏。 6.虚函数表 1带有虚函数的类编译器会为其分配一个虚函数表用数组实现里面记录了虚函数的地址当此类被继承时若子类重写了虚函数则在子类的虚函数表中覆盖父类的虚函数地址否则继承父类的虚函数地址。 2实例化后对象有一个虚函数指针虚函数指针指向虚函数表在程序运行时通过虚函数指针找到虚函数表中对应的函数地址调用虚函数 7.常用数据结构 vector向量连续存储可随机访问。 deque双向队列连续存储随机访问。 list链表内存不连续不支持随机访问。 stack栈不可随机访问只允许再开头增加/删除元素。 queue单向队列尾部增加开头删除。不支持随机访问 set集合采用红黑树实现可随机访问。查找、插入、删除时间复杂度为O(logn)。 map图采用红黑树实现可随机访问。查找、插入、删除时间复杂度为O(logn)。 hash_set哈希表随机访问。查找、插入、删除时间复杂读为O(1)。 8.TCP 9.C和C的区别 C语言是面向过程的C是C的超集继承并扩展了C语言是面向对象的 10. struct 和class 有什么区别 1struct的成员默认是public属性的class的成员默认是private属性的 2struct继承默认是public属性的class继承默认是private属性的 3“class”这个关键字还用于定义模板参数就像“typename”。但关键字“struct”不用于定义模板参数 11.extern C的作用 extern C 的主要作用就是为了能够正确实现C代码调用其它C语言代码。加上extern C后会提示编译器这部分代码按C语言而不是C的方式进行编译。 12.C重载、重写、多态 重载位于同一个类中函数名字相同形参列表不同 重写被重写的函数必须是virtual,一般用于子类在继承父类是重写父类中的方法函数名称和参数列表都相同 多态要有继承要有虚函数重写父类指针或引用指向子类对象。 13.多态的理解 多态就是多种形态C的多态分为静态多态和动态多态。静态多态就是重载因为在编译器决议确定所以成为静态多态。动态多态即运行时多态是通过继承重写基类的虚函数实现的多态因为在运行时决议确定所以称为动态多态也叫运行时多态。 14.对虚函数机制的理解单继承、多继承、虚继承条件下虚函数表的结构 单继承一个子类只有一个直接父类时称这个继承关系为单继承。将基类虚表中的内容拷贝一份到子类虚表中如果派生类重写了基类某个虚函数就用派生类自己的虚函数替换掉原先基类虚函数的入口地址。 多继承一个子类有两个或以上直接父类时称这个继承关系为多继承。多重继承会有多个虚函数表几重继承就会有几个虚函数表。这些表按照派生的顺序一次排列如果子类改写了父类的虚函数那么就会用子类自己的虚函数覆盖虚函数表相应的位置如果子类有新的虚函数那么就添加到第一个虚函数表的末尾。 虚继承C使用虚拟继承解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝同一个函数名也只有一个映射。 15.如果虚函数是有效的那为什么不把所有函数设为虚函数 虚函数是有代价的由于每个虚函数的对象都要维护一个虚函数表因此在使用虚函数的时候会产生一定的系统开销这是没有必要的。另外虚函数的调用相对于普通函数要更慢一些因为每次都要查找虚函数表有一定的时间开销。 16.为什么要虚继承 非虚继承时显然D会继承两次A 内部就会存储两份A的数据浪费空间而且还会有二义性D调用A的方法时由于有两个A究竟调用哪个A的方法呢编译器也不知道就会报错所以有了虚继承解决了空间浪费以及二义性问题。在虚继承下只有一个共享的基类对象被继承而无论该基类在派生层次中出现多少次。共享的基类子对象被称为虚基类在虚继承下基类对象的复制以及由此引起的二义性被消除了。 17.构造函数为什么一般不定义为虚函数、析构函数一般定义为虚函数 1.构造函数不可以定义为虚函数虚函数的调用需要通过虚函数指针指向虚函数表虽然虚函数表在编译时就有但虚函数指针在创建对象之后才有因此无法调用虚构造函数 2.析构函数一般定义为虚函数在动态多态时子类继承父类子类重写父类的虚析构函数父类指针或引用指向子类这样就可以通过父类指针调用子类的析构函数释放子类中开辟的内存。 18.为什么虚函数表中有两个析构函数 这是因为对象有两种构造方式栈构造和堆构造所以在对应的实现上对象也有两种析构方法其中堆上的对象和栈上的对象的析构不同之处在于栈内存的析构不需要执行delete函数会自动被回收。 19.为什么基类的析构函数要是虚函数 因为如果不设置成虚函数析构的过程中只会调用到基类的析构函数而不会调用子类的析构函数可能会产生内存泄漏。 20. volatile 关键字的作用什么时候需要使用volatile 关键字 volatile关键字告诉编译器其修饰的变量是易变的它会确保修饰的变量每次读操作都从内存里读取每次写操作都将值写到内存里。volatile关键字就是给编译器做个提示告诉编译器不要对修饰的变量做过度的优化提示编译器该变量的值可能会以其它形式被改变。 volatile用于读写操作不可以被优化掉的内存用于特种内存中。 volatile 意思是易变的是一种类型修饰符在C/C中用来阻止编译器因误认某段代码无法被代码本身所改变而造成的过度优化。编译器每次读取 volatile 定义的变量时都从内存地址处重新取值。 这里就有点疑问了难道编译器取变量的值不是从内存处取吗 并不全是编译器有时候会从寄存器处取变量的值而不是每次都从内存中取。因为编译器认为变量并没有变化所以认为寄存器里的值是最新的另外通常来说访问寄存器比访问内存要快很多编译器通常为了效率可能会读取寄存器中的变量。但是变量在内存中的值可能会被其它元素修改比如硬件或其它线程等。 21.各种强制类型转换的原理及使用 C中有四个强制类型转换的关键字 1.static_cast:用于数据类型的强制转换强制将一种数据类型转换为另一种数据类型。 用法static_cast 类型说明符 变量或表达式 int a 10; int b 3; double result static_castdouble(a) / static_castdouble(b); 它主要有如下几种用法     1用于类层次结构中基类和派生类之间指针或引用的转换       进行上行转换把派生类的指针或引用转换成基类表示是安全的       进行下行转换把基类的指针或引用转换为派生类表示由于没有动态类型检查所以是不安全的     2用于基本数据类型之间的转换如把int转换成char。这种转换的安全也要开发人员来保证     3把空指针转换成目标类型的空指针     4把任何类型的表达式转换为void类型     注意static_cast不能转换掉expression的const、volitale或者__unaligned属性。 static_cast:可以实现C中内置基本数据类型之间的相互转换。 2.const_cast:用于去除指向常量对象的指针或引用的常量性其去除常量性的对象必须为指针或引用 用法const_casttype_id (expression) 该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外 type_id和expression的类型是一样的。     常量指针被转化成非常量指针并且仍然指向原来的对象     常量引用被转换成非常量引用并且仍然指向原来的对象常量对象被转换成非常量对象。 const int a 10;const int * p a;int *q;q const_castint *(p);*q 20; //fine3.reinterpret_cast:reinterpret_cast主要有三种强制转换用途改变指针或引用的类型、将指针或引用转换为一个足够长度的整形、将整型转换为指针或引用类型。 用法reinterpret_casttype_id (expression) type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。     它可以把一个指针转换成一个整数也可以把一个整数转换成一个指针先把一个指针转换成一个整数在把该整数转换成原类型的指针还可以得到原先的指针值。 4.dynamic_cast: 用法dynamic_casttype_id (expression) 1其他三种都是编译时完成的dynamic_cast是运行时处理的运行时要进行类型检查。 2不能用于内置的基本数据类型的强制转换。 3dynamic_cast转换如果成功的话返回的是指向类的指针或引用转换失败的话则会返回NULL。 4使用dynamic_cast进行转换的基类中一定要有虚函数否则编译不通过。 dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型safe downcasting” 也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。 至于“先上转型”即派生类指针或引用类型转换为其基类类型本身就是安全的尽管可以使用dynamic_cast进行转换但这是没必要的 普通的转换已经可以达到目的毕竟使用dynamic_cast是需要开销的。 22.什么时候用指针什么时候用引用 对于那些函数它们只使用传递过来的值而不对值进行修改 1如果数据对象很小如内置数据类型或小型结构使用按值传递 2如果数据对象是数组则使用指向const的指针 3如果数据对象是较大的结构则使用const指针或者const引用以提高程序的效率 4如果数据对象是类对象则使用const引用 对于那些函数它们需要修改传递过来的值 1如果数据对象很小如内置数据类型或小型结构则使用指针 2如果数据对象是数组则只能使用指针 3如果数据对象是较大的结构则使用指针或者引用以提高程序的效率 4如果数据对象是类对象则使用引用 23.一般什么情况下会出现内存泄漏怎么用C在编码层面尽量避免内存泄漏。 内存泄漏是指程序向系统申请分配内存使用new用完却没有归还delete,结果申请的那块内存程序不能使用而系统也无法再将它分配给需要的程序。 如何避免 1.将基类的析构函数设为虚函数 2.new和delete配对使用 3.使用智能指针 24.对面向对象的理解 C面向对象的三大特性是封装、继承、多态。 C面向对象编程就是把一切事物都变成一个个对象用属性和方法来描述对象的信息比如定义一个猫对象猫的眼睛、毛发、嘴巴就可以定义为猫对象的属性猫的叫声和走路就可以定义为猫对象的方法。 25.内存分区 代码区存放函数体的二进制代码由操作系统进行管理 全局区静态区存放全局变量静态变量和常量 栈区存放函数参数、局部变量等 堆区由程序员进行手动分配和释放若程序员不释放在程序结束时有操作系统进行回收。 26.纯虚函数 纯虚函数是只有声明没有实现的虚函数包含纯虚函数的类是抽象类不能被实例化只有实现了这个纯虚函数的子类才能生成对象。 27.深拷贝和浅拷贝 浅拷贝是对对象指针的复制原对象和副本指向的是相同资源 深拷贝是开辟一片新的内存空间将原对象的资源复制到新的空间返回新空间的地址 深拷贝可以避免重复释放和写冲突。 28.悬挂指针和野指针、空指针、void指针 悬挂指针当指针所指向的对象被释放后指针的指向没有改变还是指向被回收的内存地址 野指针未初始化的指针 空指针使用null或者nullptr初始化不指向任何对象 Void指针一种特殊类型的指针可以存放任意对象的地址任意类型的指针可以指向void指针反之不行void指针需要强制类型转换才能赋值给其他指针 29.new和malloc有什么区别 1.new和delete是c的关键字/运算符malloc和free是c/c语言的标准函数 2.malloc需要显示地指定分配的内存大小new不需要 3.new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上分配内存。注:凡是通过new操作符进行内存申请该内存即为自由存储区 4.new操作符内存分配成功时返回对象类型无需进行类型转换故new是符合类型安全的操作符malloc返回void*,需要通过强制类型转换将void*指针转换成我们需要的类型 5.new操作符内存分配失败时抛出bad_alloc异常malloc内存分配失败时返回NULL 6.new操作符有构造和析构函数在开辟空间的同时会调用自定义对象的构造函数来完成初始化malloc只会开辟空间 7.new相对malloc效率要低因为new的底层封装了malloc 30.malloc的内存可以用delete释放吗 可以但是一般不这么用。malloc和free是C语言中的函数C为了兼容C语言保留下来这一对函数。简单来说new可以理解为先执行malloc来申请内存后调用构造函数来初始化对象delete是先执行析构函数后使用free来释放内存。若先new再使用free来释放空间的话可能会出现一些错误。而先使用malloc再使用delete的话没有问题。 31.malloc出来20字节内存为什么free不需要传入20呢不会产生内存泄漏吗 因为不能保证程序员使用free时传入的参数是和malloc一致的从而导致内存泄漏等问题。现在free的解决方式是让free函数自己确定要释放多少内存可以使用的方式是在申请内存时多申请一些空间来存储内存大小在free时再获取这个大小进行释放。 32.new[]和delete[]一定要配对使用吗new[]和delete[]为何要配对使用 1.不一定当类型为int、float等内置类型时可以不配对使用但是建议还是配对使用。 2.new[]为一个数组申请内存时编译器还会悄悄地在内存中保存一个整数用来表示数组中元素的个数。因为在delete一块内存时我们不仅要知道指针指向多大的内存更重要的是要知道指针指向的数组中对象的个数。因为只有知道了对象数量才能一一调用它们的析构函数完成对数组中所有对象的清理。如果使用的是delete则编译器只会将指针所指的对象当作单个对象来处理。所以对于数组需要使用delete[]来处理符号[]会告诉编译器在delete这块内存时先去获取保存的那个元素数量值然后再进行一一清理。 33.基类的析构函数一般写成虚函数的原因 在析构指向子类的父类指针时根据虚函数表找到子类的析构函数从而正确释放子类对象的资源 34.什么情况下会调用拷贝构造函数 1一个对象以值传递的方式传入函数体 2一个对象以值传递的方式从函数返回 3一个对象需要另一个对象进行初始化 35.为什么拷贝构造函数必须是引用传递而不是值传递 当一个对象需要以值方式传递时编译器会生成代码调用它的拷贝构造函数以生成一个复本。如果类A的拷贝构造函数是以值方式传递一个类A对象作为参数的话当需要调用类A的拷贝构造函数时需要以值方式传进一个A的对象作为实参 而以值方式传递需要调用类A的拷贝构造函数结果就是调用类A的拷贝构造函数导致又一次调用类A的拷贝构造函数这就是一个无限递归。 36.指针传递和引用传递的区别 指针传递的是变量“地址”引用传的是变量“别名”。区别就是指针传递的时候是新声明了一个指针指向相同地址然后传进来而引用则是将变量本身传进来只不过换了个名字。都可以对原值进行访问和修改无需创建副本。 37.成员初始化列表的概念为什么使用成员初始化列表会快一些 成员初始化列表就是在类或者构造函数中在参数列表后以冒号为开头逗号为分隔的一系列初始化字段 快因为使用成员初始化列表进行初始化的话会直接调用传入参数的拷贝构造函数进行初始化省去了一次执行传入参数的默认构造函数的过程。 38.静态链接和动态链接 静态链接在链接阶段将源文件中用到的库函数与汇编生成的目标文件合并生成可执行文件 优点方便移植执行速度快 缺点占内存每次更新都要重新链接 动态链接把调用的函数所在的文件模块和调用函数所在文件的位置等信息链接进目标程序程序在运行时再从文件模块中寻找相应的代码。 优点应用灵活不占内存 缺点速度不如静态链接快 39.虚函数的实现原理 1带有虚函数的类编译器会为其分配一个虚函数表用数组实现里面记录了虚函数的地址当此类被继承时若子类重写了虚函数则在子类的虚函数表中覆盖父类的虚函数地址否则继承父类的虚函数地址。 2实例化后对象有一个虚函数指针虚函数指针指向虚函数表在程序运行时通过虚函数指针找到虚函数表中对应的函数地址调用虚函数 40.指针函数和函数指针 指针函数就是一个返回指针的函数其本质是一个函数而该函数的返回值是一个指针。 int *fun(int x,int y); 函数指针其本质是一个指针变量该指针指向这个函数。总结来说函数指针就是指向函数的指针。 int (*fun)(int x,int y);41.内存对齐 为什么要进行内存对齐比如结构体的成员可以有不同的数据类型所占的大小也不一样。同时由于CPU读取数据是按块读取的内存对齐可以使得CPU一次就可以将所需的数据读进来 对齐规则第一个数据成员放在偏移量为0的地方以后每个数据成员的起始位置都要从自身大小的整数倍开始存储 内存对齐的好处1.加快内存读取效率2.便于在不同平台之间移植 内存对齐的缺点空间浪费 c11 1.了解auto 和decltype 吗 auto可以让编译器在编译时就推导出变量的类型 decltype用于推导表达式类型 int func() { return 0; }; decltype(func()) i; // i是intint x 0; decltype(x) y; // y是int decltype(x y) z; // z是int 2.谈一谈你对左值和右值的了解了解左值引用和右值引用吗 左值在内存中有确定存储地址、有变量名、表达式结束依然存在的值。 左值引用绑定到左值的引用通过来获得左值引用。 右值在内存中没有确定存储位置、没有变量名表达式结束就会销毁的值。 右值引用绑定到右值的引用通过来获得右值引用。 int a1 10; // 非常量左值 const int a2 10; // 常量左值int b1 a1; // 非常量左值引用 const int b2 a2; // 常量左值引用int c1 10; // 非常量右值引用 const int c2 10; // 常量右值引用10是非常量右值 3.了解移动语义和完美转发吗 移动语义可以理解为转移所有权拷贝是对于别人的资源自己重新分配一块内存存储复制过来的资源而对于移动语义类似于转让或者资源窃取的意思对于那块资源转为自己所拥有别人不再拥有也不会再使用通过C11新增的移动语义可以省去很多拷贝负担如何利用移动语义主要通过移动构造函数。C移动语义_c 可移动-CSDN博客 完美转发指可以写一个接受任意实参的函数模板并转发到其它函数目标函数会收到与转发函数完全相同的实参。转发函数实参是左值那目标函数实参也是左值转发函数实参是右值那目标函数也是右值。聊聊C中的完美转发 - 知乎 (zhihu.com) 4.平时会用到function、bind、lambda 吗都什么场景下会用到 std::function是C11标准库中提供的一种可调用对象的通用类型它可以存储任意可调用对象如函数指针函数对象成员函数指针和lambda表达式。std::function类模板是一个类似于函数指针的类型但它是可以处理任意可调用对象的并且可以检查调用对象是否为空。 基本语法 std::functionreturn_type(parameter_types) var_name; int func(int x, int y) { return x y; } std::functionint(int, int) f func;class A { public:int mem_func(int x) { return x * x; } }; std::functionint(A*, int) f2 A::mem_func; std::function对象可以像普通函数一样调用并且可以使用bool类型的运算符来检查调用对象是否为空。 std::functionint(int, int) f; if (f)std::cout f(1, 2) std::endl; elsestd::cout f is empty std::endl; std::bind的头文件是 functional它是一个函数适配器接受一个可调用对象callable object生成一个新的可调用对象来“适应”原对象的参数列表。 std::bind主要有以下两个作用 将可调用对象和其参数绑定成一个防函数只绑定部分参数减少可调用对象传入的参数。 1.std::bind绑定普通函数 double callableFunc (double x, double y) {return x/y;} auto NewCallable std::bind (callableFunc, std::placeholders::_1,2); std::cout NewCallable (10) \n; 1.bind的第一个参数是函数名普通函数做实参时会隐式转换成函数指针。因此std::bind(callableFunc,_1,2)等价于std::bind (callableFunc,_1,2) 2._1表示占位符位于functional中std::placeholders::_1 3.第一个参数被占位符占用表示这个参数以调用时传入的参数为准在这里调用NewCallable时给它传入了10其实就想到于调用callableFunc(10,2); 2.std::bind绑定一个成员函数 class Base { public:void display_sum(int a1, int a2){std::cout a1 a2 \n;}int m_data 30; }; int main() {Base base;auto newiFunc std::bind(Base::display_sum, base, 100, std::placeholders::_1);f(20); // should out put 120. } 1.bind绑定类成员函数时第一个参数表示对象的成员函数的指针第二个参数表示对象的地址。 2.必须显式地指定Base::diplay_sum因为编译器不会将对象的成员函数隐式转换成函数指针所以必须在Base::display_sum前添加 3.使用对象成员函数的指针时必须要知道该指针属于哪个对象因此第二个参数为对象的地址 base3.绑定一个引用参数 5.enum 和enum class 有什么区别 枚举作用域是指枚举类型成员名字的作用域起自其声明之处终止枚举定义结束之处。enum与class enum区别在于是否限定其作用域。C语言规定枚举类型enum的成员的可见范围被提升至该枚举类型所在的作用域内。这被认为有可能污染了外部的作用域为此C11引入了枚举类(enum class)解决此问题。   #enum enum Sex {Girl, Boy }; // 错误编译器提示 GirlBoy重定义 enum Student {Girl, Boy };#enum class enum class Sex {Girl, Boy };enum class Student {Girl, Boy };int main(int argc, char *argv[]) {Sex a Sex::Gril; Student b Student::Gril;//两者处于不同作用域下不会重定义 }枚举定义将被限制在枚举作用域内并且不能隐式转换为整数类型但是可以显式转化为整数类型 enum class Sex {Girl, Boy }; int main(int argc, char *argv[]) {Sex aSex::Gril;int d1 a; // 错误无法从“Girl”隐式转换为“int”。int d2 int(a); // 正确显示将enum class转换为整数return 0; }STL 1.C直接使用数组好还是使用std::array 好std::array 是怎么实现的 array是C11中新提出来的容器类型与内置数组相比array是一种更容易使用更加安全的数组类型可以用来替代内置数组。作为数组的升级版继承了数组最基本的特性也融入了很多容器操作 数组初始化不能直接使用拷贝和赋值!!!数组的传递只能是遍历的形式来拷贝 和数组不同的是array可以使用拷贝和赋值的形式进行初始化 arrayint,10 ial1{0,1,2,3}; arrayint,10 copyial1;//只要保证两者的类型一致就可以包括元素类型和大小 2.STL ⾥ resize 和 reserve 的区别clear 是怎么实现的 reserve()函数会有可能将容量变大 (1)如果n大于容器现有的容量(capacity),比如你容器原来是100的容量我现在指定n200那么就需要在自由内存区为整个容器重新分配一块新的更大的连续空间【因为vector是顺序容器所以存储空间是连续的如果之前的存储空间不够了必须这样做】然后将容器内所有的有效元素从旧位置全部复制到新位置这个过程是调用拷贝构造函数然后释放旧位置的所有存储空间并调整容器的元素位置指示器。所以reserve的时候如果n比原来的大结果只是让容器的冗余容量即没有分配元素的存储区变大容器的实际大小即元素个数并没有改变。 (2)如果n小于容器原来的容量那么这个函数什么作用也没有了 resize()函数:会改变size的大小 1如果n大于容器当前的大小即容器的size这里和capacity无关则在容器的末尾插入n-size()个初始值为c的元素如果没有指定初始值那就元素类型的默认构造函数来初始化。 2如果n小于容器当前的大小则删除末尾的size()-n个元素这样就导致容器的大小变了size 变小了。但是这种类型的容器在删除一个元素的时候并不会释放元素本身的内存空间【这也是为了保留这块空间以避免将来要插入新元素的时候又要进行存储空间重分配】所以容器的容量即capacity其实是没有改变的。 3n等于容器当前的大小则什么也不做。 reserve和resize的共同点就是都不缩减容器本身的容量。即对内存空间并没有影响 clear实现clear只是将vector的size置0并不保证capacity为0因此clear并不能释放vector已经申请的内存。 3.deque 的底层数据结构是什么它的内部是怎么实现的 4.map 和unordered_map 有什么区别分别在什么场景下使用 5.list 的使用场景std::find 可以传入list 对应的迭代器吗 6.string 的常用函数 assign() // 赋值 swap() // 交换 ,append(),push_back() // 尾部添加字符 insert() // 插入字符 erase() // 删除字符 clear() // 清空字符 replace() // 替换字符 substr() // 截取子字符串 操作系统 C Qt常用面试题整理不定时更新_qt面试题-CSDN博客
http://www.pierceye.com/news/27969/

相关文章:

  • 合肥市科技中心网站微商城手机网站设计
  • 淘宝客的api怎么做网站营销型网站要多少钱
  • 上海 宝安网站建设 网络服务网页设计做音乐网站
  • 目前做汽配的网站有哪些湖北企业模板建站信息
  • 如何搜索易思cms做的网站网站seo优化很好徐州百都网络点赞
  • 0基础学做网站网站2级域名 还是子目录
  • 常用的网站开发语言免费做宣传的网站是
  • 网站开发面试都会问什么问题wordpress 短代码 2017
  • 芜湖手机网站制作域名交易中心
  • 判断网站到期网站建设服务谁便宜
  • 漳州市建设网站越南语网站建设
  • 电子商务的网站建设设计书广告设计公司深圳策划设计公司
  • 购门户网站系统屏蔽网站推广
  • 各类网站推广企业 办公 网站模板
  • 网站开发建设收费标准网络游戏带来的危害
  • 新手做网站优化怎么做怎么制作网站店铺
  • 做网站一般做多大的织梦网站 联系方式修改
  • 静态网站首页更新百度识图在线使用
  • 网站的步骤徐州提供网站建设报价表
  • 东莞seo网站建设wordpress active
  • 中装建设集团网站南京做网站优化
  • 建站网站公司调查邯郸营销型网站建设
  • 网站建设中页面设计公司名称域名网站
  • 个人网站做重定向图片同城购物网站建设
  • 个人网站备案 拍照wordpress 文章页404
  • 简述网站建设的标准保定网站seo技术
  • 卖二手手表的网站深圳 网站开发
  • 营销型网站建设推荐收费网站怎么免费
  • php网站开发防注入登记注册身份验证app下载
  • 潜江网站搭建wordpress电子商务插件