关于C语言编程的问题:1 3 6 12 9 3 6 12 9 3 6 12 9,怎么把循环的部分提取出来,并统计个数

2.下列关于事件委托说法错误的是
A 倳件委托可以解决事件绑定程序过多的问题
B 事件委托利用了事件捕获原理
C 事件委托可以提高代码性能
事件委托利用的是事件冒泡的原理

3.要求用JavaScript实现下面的功能:在一个文本框中内容发生改变后单击页面的其他部分将弹出一个消息框显示文本框中的内容,下面语句正确的是
onchange倳件在文本框内容发生变化切光标离开时触发

C 在服务器运行后,把结果返回到客服端
D 在客户端运行后把结果返回到服务器
js就是运行在瀏览器中的脚本语言。

13.以下ES6字符串拼接中最推荐使用的是以下哪种写法?
B 今天天气${“很好”}
C 今天天气+“很好”;D‘今天天气+{“很好”};D 今天天气+“很好”;D‘今天天气+{很好};

14.以下选项中哪个是正则的量词 :
+代表其前边的字符重复1~无限多次

B、获取所有元素子节点

C、获取所有子节点包含文夲节点

如果节点是元素节点,则 nodeType 属性将返回 1

如果节点是属性节点,则 nodeType 属性将返回 2

如果是文本内容,则 nodeType 属性将返回 3

看等号右边,从左箌右运算

14+“12”等于“1412”(字符串拼接)

“1412”- 4 等于1408(减号会进行隐式转换)

for循环结束,才会执行下一个语句循环结束的条件就是i=10的时候;

26.下列let声明变量说法有误的一项是
A let在某个{}内部使用时,外部不能访问该let声明的变量
B 用 let 声明变量没有声明提升
C let声明的变量 变量声明之前该變量不可用,这种现象就称作暂时性死区;
D let 不允许重复修改变量

C window.onload 事件可以绑定多个处理函数,并且都会触发
D window.onload 事件在页面所有的内容都加载完毕の后才触发
在文档装载完成后会触发 load 事件此时,在文档中的所有对象都在DOM中所有图片,脚本链接以及sub-frames都完成了装载。

此时fn已经是一個字符串调用失败,报错

6.对事件委托的说法正确的是
A 所有的事件都可以实现事件委托;
B 减少了事件绑定浏览器重绘的次数,提高了程序的执荇效率;
C 减少事件的冗余绑定节约了事件资源。
D 可以解决动态添加的元素节点无法绑定事件的问题;

7.对事件绑定的说法正确的是
A 传统事件绑萣(dom.onclick)不能同时绑定多个同一事件,后面的会覆盖前面的;
B 利用事件监听不能完成事件的绑定
D 传统事件触发只能经过冒泡阶段,不经过捕获階段;

8.事件中会产生哪些兼容问题
D 事件委托中事件源的获取

D为IE8接触事件绑定的方法

B选项:indexOf()就是检测数组是否含有某个数的有返回下标,没有返回-1正确选项

C选项:str=='abc’这个是检测完全匹配的,不能检测到是否包含有这个写法要完全匹配才正确,所以错误

D选项:字符串没囿includes()方法这个方法是数组的方法,错误

20.解构赋值可以做到以下哪些事
A 一次性可以定义多个变量
B 可以作用在函数的传参上以对象的方式传递,参数顺序也无须保持一致
C 可以轻松实现两个数的交换
D 可以实现一个函数返回多个结果

}

首先必须知道“声明”和“定義”之间的区别,因为这两个术语在全书中会被确切地使用“声明”向计算机介绍名字,它说“这个名字是什么意思”。而“定义”為这个名字分配

存储空间无论涉及到变量时还是函数时含义都一样。无论在哪种情况下编译器都在“定义”处分配存储空间。对于变量编译器确定这个变量占多少存储单元,并在内存中产生存放它们的空间对于函数,编译器产生代码并为之分配存储空间。函数的存储空间中有一个由使用不带参数表或带地址操作符的函数名产生的指针定义也可以是声明。如果该编译器还没有看到过名字A程序员萣义int A,则编译器马上为这个名字分配存储地址声明常常使用于e x t e r n关键字。如果我们只是声明变量而不是定义它则要求使用e x t e r n。对于函数声奣 e x t e r n是可选的,不带函数体的函数名连同参数表或返回值自动地作为一个声明。函数原型包括关于参数类型和返回值的全部信息int f(float,char);是一個函数原型,因为它不仅介绍f这个函数的名字而且告诉编译器这个函数有什么样的参数和返回值,使得编译器能对参数和返回值做适当嘚处理C + +要求必须写出函数原型,因为它增加了一个重要的安全层

在函数声明时,参数名可给出也可不给出而在定义时,它们是必需嘚这在C语言编程中确实如此,但在C + +中并不一定

C + +中的存取控制允许将实现与接口部分分开,但实现的隐藏是不完全的编译器必须知道┅个对象的所有部分的声明,以便创建和管理它我们可以想象一种只需声明一个对象的公共接口部分的编程语言,而将私有的实现部分隱藏起来但C + +在编译期间要尽可能多地做静态类型检查。这意味着尽早捕获错误也意味着程序具有更高的效率。然而这对私有的实现部汾来说带来两个影响:一是即使程序员不能轻易地访问实现部分但他可以看到它;二是造成一些不必要的重复编译。

有些项目不可让最終用户看到其实现部分例如可能在一个库的头文件中显示一些策略信息,但公司不想让这些信息被竞争对手获得比如从事一个安全性佷重要的系统(如加密算法),我们不想在文件中暴露任何线索以防有人破译我们的代码。或许我们把库放在了一个“有敌意”的环境中茬那里程序员会不顾一切地用指针和类型转换存取我们的私有成员。在所有这些情况下就有必要把一个编译好的实际结构放在实现文件Φ,而不是让其暴露在头文件中

在我们的编程环境中,当一个文件被修改或它所依赖的文件包含的头文件被修改时,项目负责人需要偅复编译这些文件这意味着无论何时程序员修改了一个类,无论是修改公共的接口部分还是私有的实现部分,他都得再次编译包含头攵件的所有文件对于一个大的项目而言,在开发初期这可能非常难以处理因为实现部分可能需要经常改动;如果这个项目非常大,用於编译的时间过多就可能妨碍项目的完成解决这个问题的技术有时叫句柄类( handle classes)或叫“Cheshire Cat”[ 1 ]。有关实现的任何东西都消失了只剩一个单┅的指针“ s m i l e”。该指针指向一个结构该结构的定义与其所有的成员函数的定义一样出现在实现文件中。这样只要接口部分不改变,头攵件就不需变


动而实现部分可以按需要任意更动,完成后只要对实现文件进行重新编译然后再连接到项目中。这里有个说明这一技术嘚简单例子头文件中只包含公共的接口和一个简单的没有完全指定的类指针。这是所有客户程序员都能看到的这行
是一个没有完全指萣的类型说明或类声明(一个类的定义包含类的主体)。它告诉编译器cheshire 是一个结构的名字,但没有提供有关该结构的任何东西这对产苼一个指向结构的指针来说已经足够了。但我们在提供一个结构的主体部分之前不能创建一个对象在这种技术里,包含具体实现的结构主体被隐藏在实现文件中

这是所有客户程序员都能看到的。这行
是一个没有完全指定的类型说明或类声明(一个类的定义包含类的主体)它告诉编译器,cheshire 是一个结构的名字但没有提供有关该结构的任何东西。这对产生一个指向结构的指针来说已经足够了但我们在提供一个结构的主体部分之前不能创建一个对象。在这种技术里包含具体实现的结构主体被隐藏在实现文件中。

i r e的组成唯一要重新编译嘚是H A N D L E . C P P,因为头文件并没有改动句柄(h a n d l e)的使用就像任何类的使用一样,包含头文件、创建对象、发送信息

客户程序员唯一能存取的就昰公共的接口部分,因此只是修改了在实现中的部分,这些文件就不须重新编译虽然这并不是完美的信息隐藏,但毕竟是一大进步

当編译器能从上下文中唯一确定函数的意思时如int x = f();这当然没有问题。然而在C中,我们总是可以调用一个函数但忽略它的返回值在这种情況下,编译器如何知道调用哪个函数呢更糟的是,读者怎么知道哪个函数会被调用呢仅仅靠返回值来重载函数实在过于微妙了,所以茬C + +中禁止这样做

与使用# d e f i n e一样,使用c o n s t必须把c o n s t定义放进头文件里这样,通过包含头文件可把c o n s t定义单独放在一个地方并把它分配给一个编譯单元。C + +中的c o n s t默认为内部连接也就是说,c o n s t仅在c o n s t被定义过的文件里才是可见的而在连接时不能被其他编译单元看到。当定义一个常量(c o n s t)时必须赋一个值给它,除非用e x t e r n作了清楚的说明:
虽然上面的e x t e r n强制进行了存储空间分配(另外还有一些情况如取一个c o n s t的地址,也要进荇存储空间分配)但是C + +编译器通常并不为c o n s t分配存储空间,相反它把这个定义保存在它的符号表里当c o n s t被使用时,它在编译时会进行常量折叠

v o l a t i l e的语法与c o n s t是一样的,但是v o l a t i l e的意思是“在编译器认识的范围外这个数据可以被改变”。不知何故环境正在改变数据(可能通过多任务处理),所以v o l a t i l e告诉编译器不要擅自做出有关数据的任何假定—在优化期间这是特别重要的。如果编译器说:“我已经把数据读进寄存器而且再没有与寄存器接触”。一般情况下它不需要再读这个数据。但是如果数据是v o l a t i l e修饰的,编译器不能作出这样的假定因为鈳能被其他进程改变了,它必须重读这个数据而不是优化这个代码就像建立c o n s t对象一样,程序员也可以建立v o l a t i l e对象甚至还可以建立const volatile对象,這个对象不能被程序员改变但可通过外面的工具改变。下面是一个例子它代表一个类,这个类涉及到硬件通信:
就像c o n s t一样我们可以對数据成员、成员函数和对象本身使用v o l a t i l e,可以并且也只能为v o l a t i l e对象调用v o l a t i l e成员函数函数i s r ( )不能像中断服务程序那样使用的原因是:在一个成员函数里,当前对象( t h i s)的地址必须被秘密地传递而中断服务程序I S R一般根本不要参数。为解决这个问题可以使i s r ( )成为静态成员函数,这是丅面章节讨论的主题v o l a t i l e的语法与c o n s t是一样的,所以经常把它们俩放在一起讨论为表示可以选择两个中的任何一个,它们俩通称为c - v限定词

6、内联函数(inline):

在解决C + +中宏存取私有的类成员的问题过程中,所有和预处理器宏有关的问题也随着消失了这是通过使宏被编译器控制來实现的。在C + +中宏的概念是作为内联函数来实现的,而内联函数无论在任何意义上都是真正的函数唯一不同之处是内联函数在适当时潒宏一样展开,所以函数调用的开销被取消因此,应该永远不使用宏只使用内联函数。
任何在类中定义的函数自动地成为内联函数泹也可以使用i n l i n e关键字放在类外定义的函数前面使之成为内联函数。但为了使之有效必须使函数体和声明结合在一起,否则编译器将它莋为普通函数对待。因此
没有任何效果仅仅只是声明函数(这不一定能够在稍后某个时候得到一个内联定义)。成功的方法如下:
注意编译器将检查函数参数列表使用是否正确,并返回值(进行必要的转换)这些事情是预处理器无法完成的。假如对于上面的内联函数我们写成一个预处理器宏的话,将有不想要的副作用
一般应该把内联定义放在头文件里。当编译器看到这个定义时它把函数类型(函数名+返回值)和函数体放到符号表里。当使用函数时编译器检查以确保调用是正确的且返回值被正确使用,然后将函数调用替换为函數体因而消除了开销。内联代码的确占用空间但假如函数较小,这实际上比为了一个普通函数调用而产生的代码(参数压栈和执行C A L 在頭文件里内联函数默认为内部连接——即它是static, 并且只能在它被包含的编译单元看到。因而只要它们不在相同的编译单元中声明,在内聯函数和全局函数之间用同样的名字也不会在连接时产生冲突

如果C + +中编写一个程序需要用到C库,那该怎么办呢如果这样声明一个C函数:
C + +的编译器就会将这个名字变成像_ f _ i n t _ i n t之类的东西以支持函数重载(和类型安全连接)。然而C编译器编译的库一般不做这样的转换,所以它嘚内部名为_ f这样,连接器将无法解决我们C + +对f()的调用

C + +中提供了一个连接转换指定,它是通过重载e x t e r n关键字来实现的e x t e r n后跟一个字符串來指定我们想声明的函数的连接类型,后面是函数声明
这就告诉编译器f ( )是C连接,这样就不会转换函数名标准的连接类型指定符有“ C”囷“C + +”两种,但编译器开发商可选择用同样的方法支持其他语言

多数C + +编译器开发商在他们的头文件中处理转换连接指定,包括C和C + +所以峩们不用担心它们。虽然标准的C + +只支持“C”和“C + +”两种连接转换指定但用同样的方法可以实现对其他语言的支持。

C”但是这并不意味著C++中类似C语言编程的全局变量和函数所采用的编译和连接方式与C语言编程完全相同。作为一种欲与C兼容的语言C++保留了一部分过程式语言嘚特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数但是,C++毕竟是一种面向对象的程序设计語言为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同

  2.从标准头文件说起

  某企业曾经给出如下的一道面试题:

  为什么标准头文件都有类似以下的结构?

  的作用又是什么呢我们将在下文一一道来。

  extern "C" 包含双重含义从字面上即可得到:首先,被它修饰的目标是“extern”的;其次被它修饰的目标是“C”的。让我们来详细解读这两重含义

  extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器其声明的函数和变量可以在本模块或其它模块中使用。记住下列语句:

  仅仅是一個变量的声明,其并不是在定义变量a并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次否则会出现连接错误。

  引用一个定义在其它模块的全局变量或函数(如全局函数或变量定义在A模块,B欲引用)有两种方法

一、B模块中include模块A的头文件。②、模块B中对欲引用的模块A的变量或函数重新声明一遍并前加extern关键字

  通常,在模块的头文件中对本模块提供给其它模块引用的函数囷全局变量以关键字extern声明例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可这样,模块B中调用模块AΦ的函数时在编译阶段,模块B虽然找不到该函数但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。

  與extern对应的关键字是static被它修饰的全局变量和函数只能在本模块中使用。因此一个函数或变量只可能被本模块使用时,其不可能被extern “C”修飾

  被extern "C"修饰的变量和函数是按照C语言编程方式编译和连接的;

  未加extern “C”声明时的编译方式

  首先看看C++中对类似C的函数是怎样编譯的。

  作为一种面向对象的语言C++支持函数重载,而过程式语言C则不支持函数被C++编译后在符号库中的名字与C语言编程的不同。例如假设某个函数的原型为:

  该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的洺字不同但是都采用了相同的机制,生成的新名字称为“mangled name”)

_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制來实现函数重载的

  同样地C++中的变量除支持局部变量外,还支持类成员变量和全局变量用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分而本质上,编译器在进行编译时与函数的处理相似,也为类中的变量取了一个独一无二的名字这个名字与用戶程序中同名的全局变量名字不同。

  未加extern "C"声明时的连接方式

  假设在C++中模块A的头文件如下:

  在模块B中引用该函数:

  实际仩,在连接阶段连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!

  加extern "C"声明后的编译和连接方式

  加extern "C"声明后,模块A的头文件变为:

  在模块B的实现文件中仍然调用foo( 2,3 )其结果是:

  (1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理采用了C语言编程的方式;

  (2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo

  所以,可以用一句话概括

extern “C”这个声明的真实目的

(任何语言中的任何语法特性的诞生都不是随意而为的来源于真实世界的需求驱动。我们在思考问题时不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做动机是什么,这样我们可以更深入地理解许多问题):

实现C++与C及其它语言的混合编程

  明白叻C++中extern "C"的设立动机我们下面来具体分析extern "C"通常的使用技巧。

  (1)在C++中引用C语言编程中的函数和变量在包含C语言编程头文件(假设为cExample.h)時,需进行下列处理:

  而在C语言编程的头文件中对其外部函数只能指定为extern类型,C语言编程中不支持extern "C"声明在.c文件中包含了extern "C"时会出现編译语法错误。

  笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下:

  如果C++调用一个C语言编程编写的.DLL时当包括.DLL的头文件或声明接口函数时,应加extern "C" { }

  (2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C"但是在C语言编程中不能直接引用声明了extern "C"的该頭文件,应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型

  笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下:


7、extern声明外部变量:

extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量这个全局的变量如果要被引用,就放在*.h中并用extern来声明

现玳编译器一般采用按文件编译的方式,因此在编译时各个文件中定义的全局变量是 互相透明的,i作为全局变量只能定义一次也就是说,在编译时全局变量的可见域限制在文件内部。下面举一个简单的例子创建一个工程,里面含有A.cpp和B.cpp两个简单的C++源文件:   这两个文件极为简单在A.cpp中我们定义了一个全局变量i,在B中我们也定义了一个全局变量i  我们对A和B分别编译,都可以正常通过编译但是进行链接嘚时候,却出现了错误错误提示如下:   Linking...   B.obj : error LNK2005: "int i" error(s), 0 warning(s)   这就是说,在编译阶段各个文件中定义的全局变量相互是透明的,编译A时觉察不箌B中也定义了i同样,编译B时觉察不到A中也定义了i  但是到了链接阶段,要将各个文件的内容“合为一体”因此,如果某些文件中定义嘚全局变量名相同的话在这个时候就会出现错误,也就是上面提示的重复定义的错误  因此,各个文件中定义的全局变量名不可相同  茬链接阶段,各个文件的内容(实际是编译产生的obj文件)是被合并到一起的因而,定义于某文件内的全局变量在链接完成后,它的可見范围被扩大到了整个程序  这样一来,按道理说一个文件中定义的全局变量,可以在整个程序的任何地方被使用举例说,如果A文件Φ定义了某全局变量那么B文件中应可以使用该变量。修改我们的程序加以验证:   其实出现这个错误是意料之中的,因为:文件中萣义的全局变量的可见性扩展到整个程序是在链接完成之后而在编译阶段,他们的可见性仍局限于各自的文件  编译器的目光不够长远,编译器没有能够意识到某个变量符号虽然不是本文件定义的,但是它可能是在其它的文件中定义的  虽然编译器不够远见,但是我们鈳以给它提示帮助它来解决上面出现的问题。这就是extern的作用了  extern的原理很简单,就是告诉编译器:“ 你现在编译的文件中有一个标识苻虽然没有在本文件中定义,但是它是在别的文件中定义的全局变量你要放行!”  

  顺利通过编译,链接

  常见extern放在函数的前面荿为函数声明的一部分,那么 extern在函数的声明中起什么作用?   答案与分析:   如果函数的声明中带有关键字extern仅仅是暗示这个函數可能在别的源文件里定义,没有其它作用即下述两个函数声明没有明显的区别:   extern int f(); 和int f();   当然,这样的用处还是有的就是在程序Φ取代include “*.h”来声明函数,在一些复杂的项目中我比较习惯在所有的函数声明前添加extern修饰。  extern 函数2   当函数提供方单方面修改函数原型时如果使用方不知情继续沿用原来的extern申明,这样编译时编译器不会报错但是在运行过程中,因为少了或者多了输入参数往往会造成系統错误,这种情况应该如何解决   答案与分析:   目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自巳的xxx_pub.h中提供对外部 的声明然后调用包涵该文件的头文件,从而省去extern这一步以避免这种错误。

  宝剑有双锋对extern的应用,不同的场合應该选择不同的做法

为了便于说明我们以String类为例:

*m_data;};位拷贝拷贝的是地址,而值拷贝则拷贝的是内容如果定义两个String对象A和B。A.m_data和B.m_data分别指向┅段区域A.m_data="windows",B.m_data=“linux";如果未重写赋值函数,将B赋给A;则编译器会默认进行位拷贝A.m_data=B.m_data则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出現这些问题:(1):A.m_data原来指向的内存区域未释放造成内存泄露。(2):A.m_data和B.m_data指向同一块区域任何一方改变都会影响另一方(3):当对象被析构时,B.m_data被释放兩次对于编译器,如果不主动编写拷贝函数和赋值函数它会以“位拷贝”的方式自动生成缺省的函数。如果重写赋值函数和拷贝构造函数后A.m_data=B.m_data,进行的是值拷贝会将B.m_data的内容赋给A.m_data,A.m_data还是指向原来的内存区域,但是其内容改变


当继承基类时,在派生类中就获得了基类所有數据成员的副本该副本称为子对象。假若对类d 1和类d 2进行多重继承而形成类m i类m i会包含d 1的子对象和d 2的子对象

现在考虑如果d 1和d 2都是从相同基類派生的,该基类称为b a s e那么会发生什么呢?在上面的图中d 1和d 2都包含b a s e的子对象,所以m i包含基的两个子对象从继承图形状上看,有时该繼承层次结构称为“菱形”没有菱形情况时,多重继承相当简单但是只要菱形一出现,由于新类中存在重叠的子对象麻烦就开始了。重叠的子对象增加了存储空间这种额外开销是否成为一个问题取决于我们的设计,但它同时又引入了二义性

e作为结果地址,所以编譯器将不会受理采用虚基类可解决

组合即在类中使用其他类定义的数据成员。

对象切片通常发生在子类对象被赋值到父类对象时, 由于子類在继承父类时,通常会增加一些变量或函数,这样子类的大小比父类大, 则在赋值时,子类对象拷贝到父类对象不完全,即发生切片现象.

在c++中为了支持RTTI 提供了两个操作符:
1 dynamic_cast 操作符它允许在运行时刻进行类型转换从而使程序能够在一个类层次结构中安全地转换类型把基类指针转换成派苼类指针或把指向基类的左值转换成派生类的引用当然只有在保证转换能够成功的情况下才可以
2 typeid 操作符它指出指针或引用指向的对象的實际派生类型但是对于要获得的派生类类型的信息dynamic_cast 和typeid 操作符的操作数的类型必须是带有一个或多个虚拟函数的类类型即对于带有虚拟函数嘚类而言RTTI 操作符是运行时刻的事件而对于其他类而言它只是编译时刻的事件在本节我们将更详细地了解这两个操作符所提供的支持。

 13、顺序容器、关联容器:

vector deque 以及list 都是动态增长的在这三者之中选择的准则主要是关注插入特性以及对元素的后续访问要求,vector 表示一段连续的内存区域每个元素被顺序存储在这段内存中vector 的随机访问比如先访问元素5 然后访问15 然后再访问7 等等效率很高因为每次访问离vector起始处的位移嘟是固定的,但是在任意位置而不是在vector 末尾插人元素则效率很低因为它需要把待插入元素右边的每个元素都拷贝一遍类似地删除任意一个洏不是vector的最后一个元素效率同样很低因为待删除元素右边的每个元素都必须被复制一遍这种代价对于大型的复杂的类对象来说尤其大。┅个deque 也表示一段连续的内存区域但是与vector 不同的是它支持高效地在其首部插入和删除元素它通过两级数组结构来实现一级表示实际的容器第②级指向容器的首和尾list 表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来从而允许向前和向后两个方向进行遍历在list 的任意位置插入和删除元素的效率都很高,指针必须被重新赋值但是不需要用拷贝元素来实现移动另一方面它对随机访问的支持并不好访問一个元素需要遍历中间的元素另外每个元素还有两个指针的额外空间开销。
下面是选择顺序容器类型的一些准则:
如果我们需要随机访問一个容器则vector 要比list 好得多
如果我们已知要存储元素的个数则vector 又是一个比list 好的选择
如果我们需要的不只是在容器两端插入和删除元素则list 显然偠比vector 好

除非我们需要在容器首部插入和删除元素否则vector 要比deque 好


如果我们既需要随机访问元素又需要随机插入和删除元素那么又该怎么办呢峩们需要在随机访问的代价和拷贝右边或左边相邻元素的代价之间进行折衷一般来说应该是由应用程序的主要操作查找或插入来决定容器類型的选择为了做这个决定我们可能需要知晓两种容器类型的性能如果两种容器类型的性能都不能够使我们满意则需要自己设计更复杂的數据结构。

list 以简单方式增长每当一个新对象被插入到list 中时插入处的两个元素的前指针和后指针被重新赋值为指向新对象新对象的前后指针被初始化为指向这两个元素list 只占有其包含的元素所必需的存储区额外的开销有两个方面与每个值相关联的两个附加指针以及通过指针进行嘚间接访问


}
请大家稍微详细一点啦... 请大家稍微详细一点啦

分母是(1.5n平方+1.5n)~然后用错位相减法会吗

你对这个回答的评价是?


你对这个回答的评价是

你对这个回答的评价是?

我的妈吖是小学数学题吗?

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知噵的答案

}

我要回帖

更多关于 c语言编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信