文档库 最新最全的文档下载
当前位置:文档库 › vector容器用法详解

vector容器用法详解

vector容器用法详解
vector容器用法详解

vector容器用法详解

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector 对象元素个数的增大和缩小而自动变化。

vector类常用的函数如下所示:

1.构造函数

?vector():创建一个空vector

?vector(int nSize):创建一个vector,元素个数为nSize

?vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t

?vector(const vector&):复制构造函数

?vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

2.增加函数

?void push_back(const T& x):向量尾部增加一个元素X

?iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x

?iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x

?iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

3.删除函数

?iterator erase(iterator it):删除向量中迭代器指向元素

?iterator erase(iterator first,iterator last):删除向量中[first,last)中元素

?void pop_back():删除向量中最后一个元素

?void clear():清空向量中所有元素

4.遍历函数

?reference at(int pos):返回pos位置元素的引用

?reference front():返回首元素的引用

?reference back():返回尾元素的引用

?iterator begin():返回向量头指针,指向第一个元素

?iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置

?reverse_iterator rbegin():反向迭代器,指向最后一个元素

?reverse_iterator rend():反向迭代器,指向第一个元素之前的位置5.判断函数

?bool empty() const:判断向量是否为空,若为空,则向量中无元素6.大小函数

?int size() const:返回向量中元素的个数

?int capacity() const:返回当前向量张红所能容纳的最大元素值?int max_size() const:返回最大可允许的vector元素数量值

7.其他函数

?void swap(vector&):交换两个同类型向量的数据

?void assign(int n,const T& x):设置向量中第n个元素的值为x ?void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

示例:

1.初始化示例

#include "stdafx.h"

#include

#include

using namespace std;

class A

{

//空类

};

int _tmain(int argc, _TCHAR* argv[])

{

//int型vector

vector vecInt;

//float型vector

vector vecFloat;

//自定义类型,保存类A的vector

vector vecA;

//自定义类型,保存指向类A的指针的vector

vector vecPointA;

return 0;

}

// vectorsample.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

using namespace std;

class A

{

//空类

};

int _tmain(int argc, _TCHAR* argv[])

{

//int型vector,包含3个元素

vector vecIntA(3);

//int型vector,包含3个元素且每个元素都是9

vector vecIntB(3,9);

//复制vecIntB到vecIntC

vector vecIntC(vecIntB);

int iArray[]={2,4,6};

//创建vecIntD

vector vecIntD(iArray,iArray+3);

//打印vectorA,此处也可以用下面注释内的代码来输出vector中的数据/*for(int i=0;i

{

cout<

}*/

cout<<"vecIntA:"<

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++) {

cout<<*it<<" ";

}

cout<

//打印vecIntB

cout<<"VecIntB:"<

for(vector::iterator it = vecIntB.begin() ;it!=vecIntB.end();it++) {

cout<<*it<<" ";

}

cout<

//打印vecIntC

cout<<"VecIntB:"<

for(vector::iterator it = vecIntC.begin() ;it!=vecIntC.end();it++) {

cout<<*it<<" ";

}

cout<

//打印vecIntD

cout<<"vecIntD:"<

for(vector::iterator it = vecIntD.begin() ;it!=vecIntD.end();it++) {

cout<<*it<<" ";

}

cout<

return 0;

}

程序的运行结果如下:

上面的代码用了4种方法建立vector并对其初始化

2.增加及获得元素示例:

// vectorsample.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

//int型vector,包含3个元素

vector vecIntA;

//插入1 2 3

vecIntA.push_back(1);

vecIntA.push_back(2);

vecIntA.push_back(3);

int nSize = vecIntA.size();

cout<<"vecIntA:"<

//打印vectorA,方法一:

for(int i=0;i

{

cout<

}

cout<

//打印vectorA,方法二:

for(int i=0;i

{

cout<

}

cout<

//打印vectorA,方法三:

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++)

{

cout<<*it<<" ";

}

cout<

return 0;

}

上述代码对一个整形向量类进行操作,先定义一个整形元素向量类,然后插入3个值,并用3种不同的方法输出,程序运行结果如下:

// vectorsample.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

using namespace std;

class A

{

public:

int n;

public:

A(int n)

{

this->n = n;

}

};

int _tmain(int argc, _TCHAR* argv[])

{

//int型vector,包含3个元素

vector vecClassA;

A a1(1);

A a2(2);

A a3(3);

//插入1 2 3

vecClassA.push_back(a1);

vecClassA.push_back(a2);

vecClassA.push_back(a3);

int nSize = vecClassA.size();

cout<<"vecClassA:"<

//打印vecClassA,方法一:

for(int i=0;i

{

cout<

}

cout<

//打印vecClassA,方法二:

for(int i=0;i

{

cout<

}

cout<

//打印vecClassA,方法三:

for(vector::iterator it = vecClassA.begin();it!=vecClassA.end();it++) {

cout<<(*it).n<<" ";

}

cout<

return 0;

}

上述代码通过定义元素为类的向量,通过插入3个初始化的类,并通过3种方法输出,运行结果如下:

// vectorsample.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

using namespace std;

class A

{

public:

int n;

public:

A(int n)

{

this->n = n;

}

};

int _tmain(int argc, _TCHAR* argv[])

{

//int型vector,包含3个元素

vector vecClassA;

A *a1 = new A(1);

A *a2 = new A(2);

A *a3 = new A(3);

//插入1 2 3

vecClassA.push_back(a1);

vecClassA.push_back(a2);

vecClassA.push_back(a3);

int nSize = vecClassA.size();

cout<<"vecClassA:"<

//打印vecClassA,方法一:

for(int i=0;i

{

cout<n<<"\t";

}

cout<

//打印vecClassA,方法二:

for(int i=0;i

{

cout<n<<"\t";

}

cout<

//打印vecClassA,方法三:

for(vector::iterator it = vecClassA.begin();it!=vecClassA.end();it++)

{

cout<<(**it).n<<"\t";

}

cout<

delete a1; delete a2;delete a3;

return 0;

}

上述代码通过定义元素为类指针的向量,通过插入3个初始化的类指针,并通过3种方法输出指针指向的类,运行结果如下:

3.修改元素示例

修改元素的方法主要有三种:1.通过数组修改,2.通过引用修改,3.通

过迭代器修改

// vectorsample.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

//int型vector,包含3个元素

vector vecIntA;

//插入1 2 3

vecIntA.push_back(1);

vecIntA.push_back(2);

vecIntA.push_back(3);

int nSize = vecIntA.size();

//通过引用修改vector

cout<<"通过数组修改,第二个元素为8:"<

vecIntA[1]=8;

cout<<"vecIntA:"<

//打印vectorA

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++) {

cout<<*it<<" ";

}

cout<

//通过引用修改vector

cout<<"通过引用修改,第二个元素为18:"<

int &m = vecIntA.at(1);

m=18;

cout<<"vecIntA:"<

//打印vectorA

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++)

{

cout<<*it<<" ";

}

cout<

//通过迭代器修改vector

cout<<"通过迭代器修改,第二个元素为28"<

vector::iterator itr = vecIntA.begin()+1;

*itr = 28;

cout<<"vecIntA:"<

//打印vectorA

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++)

{

cout<<*it<<" ";

}

cout<

return 0;

}

程序运行结果如下:

4.删除向量示例

删除向量主要通过erase和pop_back,示例代码如下

// vectorsample.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

//int型vector,包含3个元素

vector vecIntA;

//循环插入1 到10

for(int i=1;i<=10;i++)

{

vecIntA.push_back(i);

}

vecIntA.erase(vecIntA.begin()+4);

cout<<"删除第5个元素后的向量vecIntA:"<

//打印vectorA

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++) {

cout<<*it<<"\t";

}

cout<

//删除第2-5个元素

vecIntA.erase(vecIntA.begin()+1,vecIntA.begin()+5);

cout<<"删除第2-5个元素后的vecIntA:"<

//打印vectorA

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++) {

cout<<*it<<"\t";

}

cout<

//删除最后一个元素

vecIntA.pop_back();

cout<<"删除最后一个元素后的vecIntA:"<

//打印vectorA

for(vector::iterator it = vecIntA.begin();it!=vecIntA.end();it++) {

cout<<*it<<"\t";

}

cout<

return 0;

}

程序运行结果如下:

3.进一步理解vector,如下图所示:

当执行代码vector v(2,5)时,在内存里建立了2个整形元素空间,值是5.当增加一个元素时,原有的空间由2个编程4个整形元素空间,并把元素1放入第3个整形空间,第4个空间作为预留空间。当增加元素2时,直接把值2放入第4个空间。当增加元素3时,由于原有向量

中没有预留空间,则内存空间由4个变为8个整形空间,并把值放入第5个内存空间。

总之,扩大新元素时,如果超过当前的容量,则容量会自动扩充2倍,如果2倍容量仍不足,则继续扩大2倍。本图是直接在原空间基础上画的新增空间,其实要复杂的多,包括重新配置、元素移动、释放原始空间的过程。因此对vector容器而言,当增加新的元素时,有可能很快完成(直接存在预留空间中),有可能稍慢(扩容后再放新元素);对修改元素值而言是较快的;对删除元素来说,弱删除尾部元素较快,非尾部元素稍慢,因为牵涉到删除后的元素移动。

4.综合示例

// vectorsample.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include

#include

using namespace std;

class Student

{

public:

string m_strNO;

string m_strName;

string m_strSex;

string m_strDate;

public:

Student(string strNO,string strName,string strSex,string strDate)

{

m_strNO = strNO;

m_strName = strName;

m_strSex = strSex;

m_strDate = strDate;

}

void Display()

{

cout<

cout<

cout<

cout<

}

};

class StudCollect

{

vector m_vStud;

public:

void Add(Student &s)

{

m_vStud.push_back(s);

}

Student* Find(string strNO)

{

bool bFind = false;

int i;

for(i = 0;i < m_vStud.size();i++)

{

Student& s = m_vStud.at(i);

if(s.m_strNO == strNO)

{

bFind = true;

break;

}

}

Student *s = NULL;

if(bFind)

s = &m_vStud.at(i);

return s;

}

};

int _tmain(int argc, _TCHAR* argv[])

{

Student s1("1001","zhangsan","boy","1988-10-10");

Student s2("1002","lisi","boy","1988-8-25");

Student s3("1003","wangwu","boy","1989-2-14");

StudCollect s;

s.Add(s1);

s.Add(s2);

s.Add(s3);

Student *ps = s.Find("1002");

if(ps)

ps->Display();

return 0;

}

代码运行实例如下:

商务写作指南:超好记的appreciate的用法

WRONG: We would appreciate if you corrected the entry in the register as soon as possible. 错误用法:如果你能尽快更改登记处的入口,我将非常感激。 RIGHT: We would appreciate it if you corrected the entry in the register as soon as possible. 正确用法:如果你能尽快更改登记处的入口,我将非常感激(英语原句比前者多了一个it)。This is a very common mistake, and remember that when you use the phrase “I would appreciat e…”you MUST include the word “it”before “if”: 这是一个常见错误,记住当你要用“I would appreciate…”这个表达式时,一定要在if前加一个it。 More examples: 更多例子: E.g.1:I am sure the supervisory authority would not appreciate it if you took that course of action. 例1:我相信监督部门对你的所作所为不会表示欣赏。 E.g.2:We would appreciate it if you would arrange for immediate payment. 例2:如果您能立即付款,我们将很感激。 There is no need to add “it”if you do not include “if”. 如果你不用if从句的话,就没有必要在appreciate后面加it了。 E.g.: We would much appreciate a letter informing us of the result of your enquiries. 例句:如果您能对您的询盘结果给我们回信的话,我们将非常感激。 An alternative phrase to “I would appreciate it if…”is, “I would be grateful if…”This is the more formal phrase of the two and does not require that troublesome“it”! “I would appreciate it if…”这个表达式的替代用法有“I would be grateful if…”,但是这个用法更为正式,而且不需要加那个麻烦的“it”!

C++容器

C++容器类 分类:C++2014-07-13 09:56 34人阅读评论(0) 收藏举报什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象的对象,当然这是一个朴素的理解,这种“对象”还包含了一系列处理“其它对象”的方法,因为这些方法在程序的设计上会经常被用到,所以容器也体现了一个好处,就是“容器类是一种对特定代码重用问题的良好的解决方案”。 容器还有另一个特点是容器可以自行扩展。在解决问题时我们常常不知道我们需要存储多少个对象,也就是说我们不知道应该创建多大的内存空间来保存我们的对象。显然,数组在这一方面也力不从心。容器的优势就在这里,它不需要你预先告诉它你要存储多少对象,只要你创建一个容器对象,并合理的调用它所提供的方法,所有的处理细节将由容器来自身完成。它可以为你申请内存或释放内存,并且用最优的算法来执行您的命令。 容器是随着面向对象语言的诞生而提出的,容器类在面向对象语言中特别重要,甚至它被认为是早期面向对象语言的基础。在现在几乎所有的

面向对象的语言中也都伴随着一个容器集,在C++ 中,就是标准模板库(STL )。 和其它语言不一样,C++ 中处理容器是采用基于模板的方式。标准C++ 库中的容器提供了多种数据结构,这些数据结构可以与标准算法一起很好的工作,这为我们的软件开发提供了良好的支持! 通用容器的分类 STL 对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。 顺序性容器是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。这个位置和元素本身无关,而和操作的时间和地点有关,顺序性容器不会根据元素的特点排序而是直接保存了元素操作时的逻辑顺序。比如我们一次性对一个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是一致的。 关联式容器和顺序性容器不一样,关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。但是关联式容器提供了另一种根据元素特点排序的功能,这样迭代器就能根据元素的特点“顺序地”获取元素。

英语语法专项:动名词用法讲解及练习(附答案)

你听过英文语法有动词(verb)、名词(noun);但你听过有动名词(gerund)吗? 1. The girl is singing a song. 2. The girl singing now is my sister. 3. Singing is one of her hobbies(爱好). 三个句子中都有singing。第一个句子的singing是常见的现在进行式(Present Continuous),是说眼下正在做什么;第二个句子的singing是现在分词(Present Participle),它把sing这个动词转为形容词,但仍有动词的成份(哈哈,这么一说,要把你搞晕了吧:-) 。关于分词,以后有空再谈OK?)。好戏在后头,你看看第三个句子的singing到底是什么东东呀?原来就是我们的主角动名词(Gerund)了!憧矗瑂ing原本是个动词,可是现在它加上ing后,看来竟像是一个名词了。 一、名词性的动名词(Nominal Gerund) Nominal Gerund 可以加上定冠词(Definite article,如the)或不定冠词(Indefinite article,如a, an),其他可加在动名词前的还有如:my, this, some, any, all, no 等等。举例如下: 1. The mellow(愉快地) singing of the birds announces the coming of spring. (singing前加定冠词the及形容词mellow;coming 前加the) 2. We knew the robber was near when we heard a faint rustling(沙沙声) in the bushes. (rustling 前加不定冠词a及形容词faint) 从上面的例子可看出如何将一个动词转成名词;但它和真正的名词还是有区别的,那就是没有单数或复数之分。不过,有一些动名词是可以变成真正名词的喔,如:saying, writing, opening, painting, cutting, heading, feeling, being,saving, surrounding, crossing, misunderstanding 等等。它们都可以有复数的喔,方法就是在它们的后面加个s,如:paintings。 二、动词性的动名词(Verbal Gerund) 看看下面的句子: Carelessly writing essays annoys the teacher. 上面的句子里的writing是动名词,但前面有副词carelessly(粗心地),后面又有受词(Object) essays。因此writing就有动词的特征。 注意:Verbal Gerund 这类动名词的前面可不能加上任何冠词(the, a, an ...)喔。 动名词的功能与用法 一、在句子中用作主语(Subject)或主语的补语(Subject Complement): 1.1 作主语 1. Listening to music gives me pleasure. (主语Listening ) 2. Running is good exercise. (主语running) 3. Walking to school is a good idea. (主语walking) 1.2 作主语的补语 1. My cat's favorite activity is sleeping. (补语sleeping) 2. Seeing is believing. (主语seeing, 补语believing) 1.3 主语置于句尾 1.3.1 用It + be + ... +v-ing 句型 1. It is fun speaking English. 2. It is of great importance fighting against pollution(污染).

appreciate表示感谢的用法

外教一对一https://www.wendangku.net/doc/6914244236.html, 用appreciate表示「感谢」,用对不容易 在邮件里表示「感谢」的时候,我们常常会用到appreciate一词;在比较正式的场合,你也会偶尔听到有英美人在口语中使用appreciate 来表示「感谢」的含义。本帖将教会大家如何用对appreciate一词。1)表示感谢的时候,appreciate的对象通常不是某人,而是某件事。 和动词thank不一样的地方在于:thank 后面常常是某人。比如:Thank you for doing sth。但是appreciate后面常常是某件事,比如:I really appreciate your help. 很感谢你的帮助。Your support is greatly appreciated. 很感谢你的支持。以上的两个例句,通常都用在帮助或者支持完成之后说。而下面的这句话,是我们邮件中最常用的句式:I would appreciate it if you paid in cash. 如果你用现金支付,我会非常感谢。这个邮件的高频句式其实很容易出错,注意以下三点:appreciate后面的it不能漏掉appreciate后面不能直接加you以上面的句子为例,主句里的would和从句里的paid使用了过去式,是为了让语气更加婉转,而非表达过去的含义。I will appreciate it if...do...这样的句式也正确。2)中文里可以「欣赏」某人的品质;appreciate也一样。 中文里「欣赏」一词有两层含义:领略欣赏。比如:欣赏一段音乐认为……好。比如:老板很欣赏他的才华。巧合的是,appreciate 也有这两层含义:领略欣赏。You can't fully appreciate foreign literature in translation. 看翻译作品很难欣赏到外国文学的精髓。认为……好。His talents are not fully appreciated in that company. 在那个公司,他的才能得到充分地赏识。丨There's no point buying him expensive wines - he doesn't appreciate them. 别给他买很贵的酒,他不懂得品赏。3)appreciate还有一层生僻的含义:增值 我们会在财经新闻里看到appreciate及其反义词depreciate,分别表示「增值」和「贬值」。Their investments have appreciated over the years. 他们的投资在几年间增值了。currency depreciation 货币贬值 文章来源:https://www.wendangku.net/doc/6914244236.html,

vector的应用

C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。要解决此问题我们自己实现这样的类。在标准C++中,用容器向量(vector)实现。容器向量也是一个类模板。 标准库vector类型使用需要的头文件:#include 。vector 是一个类模板。不是一种数据类型,vector是一种数据类型。Vector的存储空间是连续的,list不是连续存储的。 一、定义和初始化 vector< typeName > v1; //默认v1为空,故下面的赋值是错误的 v1[0]=5; vectorv2(v1); 或v2=v1;或vector v2(v1.begin(), v1.end());//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。 vector< typeName > v3(n,i);//v3包含n个值为i的typeName类型元素vector< typeName > v4(n); //v4含有n个值为0的元素 int a[4]={0,1,2,3,3}; vector v5(a,a+5);//v5的size为5,v5被初始化为a 的5个值。后一个指针要指向将被拷贝的末元素的下一位置。 vector v6(v5);//v6是v5的拷贝 vector< 类型 > 标识符(最大容量,初始所有值); 二、值初始化 1> 如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。 2> 如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。 3> 如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。 三、vector对象最重要的几种操作 1. v.push_back(t)在容器的最后添加一个值为t的数据,容器的size变大。 另外list有push_front()函数,在前端插入,后面的元素下标依次增大。 2. v.size() 返回容器中数据的个数,size返回相应vector类定义的size_type的值。v.resize(2*v.size)或

appreciate用法

appreciate的习惯用法 1. 其后可接名 (代)词、动名词、名词性从句等作宾语,但不能接不定式: We shall appreciate hearing from you again. 能再次收到你的来信,我们将十分感激。 I appreciate that you have come here so early. 感谢你来得这么早。 2、习惯上不用“人”作宾语,其后只能接“事”作宾语,而不能接“人”作宾语 (注意:这与thank 的用法恰恰相反): 正:I appreciate your kindness. 谢谢你的好意。 误:I appreciate you for your kindness. 正:He thanked her for her kindness.他感谢她的好意。 误:He thanked her kindness. 3. 关于修饰语的搭配习惯,表示程度,可用 deeply, highly, (very) much 等修饰: I deeply appreciate your kindness. 我深深感谢.. He highly appreciated their help. 他非常感谢.. 注意:much 修饰 appreciate 时,只能置于其前,而不能置于其后,但 very much 却可以):我们非常感谢你的邀请。 正:We much appreciate your invitation. 正:We appreciate your invitation very much. 误:We appreciate your invitation much.

容器的优缺点及各种容器介绍

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

如果我们需要的不只是在容器两端插入和删除元素则list显然要比vector好 除非我们需要在容器首部插入和删除元素否则vector要比deque好 1 vector向量相当于一个数组 在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy ()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。 优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组 进行动态操作。通常体现在push_back() pop_back() (2) 随机访问方便,即支持[ ]操作符和vector.at() (3) 节省空间。 缺点:(1) 在内部进行插入删除操作效率低。 (2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。 (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释 放 2 list双向链表 每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。 优点:(1) 不使用连续内存完成动态操作。 (2) 在内部方便的进行插入和删除操作 (3) 可在两端进行push、pop 缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at() (2) 相对于verctor占用内存多 3 deque双端队列 double-end queue deque是在功能上合并了vector和list。 优点:(1) 随机访问方便,即支持[ ]操作符和vector.at() (2) 在内部方便的进行插入和删除操作 (3) 可在两端进行push、pop 缺点:(1) 占用内存多 使用区别: 1 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector 2 如果你需要大量的插入和删除,而不关心随即存取,则应使用list 3 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此 它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间

英语词汇正误辨析 arouse正误用法

英语词汇正误辨析arouse正误用法 ■这本书引起了我对政治的兴趣。 误:The book aroused at my interest in politics. 正:The book aroused my interest in politics. 析:arouse(引起,激起,唤起)是及物动词,其后接宾语时,无需用任何介词。顺便说一句:arouse 的宾语通常兴趣、怀疑、愤怒、同情、批评、讨论等较抽象的东西。 ■演讲者激起了听众的愤怒。 误:The speaker aroused the audience with anger. 正:The speaker aroused the audience to anger. 析:表示激励或唤起某人做某事,通常用arouse sb to sth,注意通常用介词to,其实此句也可说成:The speaker arousedthe anger of the audience.又如:He tried to arouse her to action.(他试图要使她采取行动)。 ■能再次收到你的来信, 我们将十分感激。 误:We shall appreciate to hear from you again. 正:We shall appreciate hearing from you again. 析:appreciate(感激)后接动词时,要用动名词,不用不定式。 ■谢谢你的好意。 误:I appreciate you for your kindness.

正:I appreciate your kindness. 正:Thank you for your kindness. 析:其后只能接“事”作宾语,而不能接“人”作宾语,此用法与thank 的用法恰恰相反。 ■如果你能帮助我做这事,我将十分感激。 误:I would appreciate very much if you would help me with it. 正:I would appreciate it very much if you would help me with it. 析:appreciate(感激)是及物动词,其后不能没有宾语。另外也有的词书(如《朗文当代英语词典》)将I would appreciate it if...视为一个固定句型。另外有时其中的if从句也可能换成when从句。如:We really appreciate it when she offered to help.(她来帮忙了,我们十分感激)。

c++中vector的用法详解

c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: 首先在程序开头处加上#include以包含所需要的类文件vector 还有一定要加上using namespace std; 2.变量声明: 2.1 例:声明一个int向量以替代一维的数组:vector a;(等于声明了一个int 数组a[],大小没有指定,可以动态的向里面添加删除)。 2.2 例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector a.同理想用向量代替三维数组也是一样,vector a;再往上面依此类推. 3.具体的用法以及函数调用: 3.1 如何得到向量中的元素?其用法和数组一样:

例如: vector a int b = 5; a.push_back(b);//该函数下面有详解 cout< 1.push_back 在数组的最后添加一个数据 2.pop_back 去掉数组的最后一个数据 3.at 得到编号位置的数据 4.begin 得到数组头的指针 5.end 得到数组的最后一个单元+1的指针6.front 得到数组头的引用7.back 得到数组的最后一个单元的引用8.max_size 得到vector最大可以是多大9.capacity 当前vector分配的大小10.size 当前使用数据的大小11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值12.reserve 改变当前vecotr所分配空间的大小13.erase 删除指针指向的数据项14.clear 清空当前的vector15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)1 6.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)1 7.empty 判断vector是否为空1 8.swap 与另一个vector交换数据 3.2 详细的函数实现功能:其中vector c. c.clear()移除容器中所有数据。

表语从句用法详解

表语从句用法详解(例句丰富) 一、表语从句的引导词 引导表语从句的词有连词that, whether,连接代词和连接副词,关系代词型what,以及as if, as though, because等连词。 1. 由that引导 The fact is that he doesn’t really try. 事实是他没有做真正的努力。 The trouble is that I have lost his address. 麻烦的是我把他的地址丢了。 My suggestion is that we should tell him. 我的建议是我们应该告诉他。 His sole requirement was (is) that the system work. 他唯一的要求是这个制度能起作用。 My idea is that we should start making preparations right now. 我的意见是我们马上就开始做准备工作。 2. 由whether引导 The question is whether the film is worth seeing. 问题是这部电影是否值得看。 【注意】whether 可引导表语从句,但与之同义的if却通常不用于引导表语从句。 3. 由连接代词引导 You are not who I thought you were. 你已不是我过去所想像的人。 The problem is who we can get to replace her. 问题是我们能找到谁去替换她呢。 The question is who (m) we should trust. 问题是我们应当相信谁。 What I want to know is which road we should take. 我想知道的是我们应走哪条路。 4. 由连接副词引导 The problem is how we can find him. 问题是我们如何找到他。 That was when I was fifteen. 这是我15岁时发生的事。 That’s where I first met her. 那就是我第一次遇见她的地方。 That’s why he didn’t come. 这就是他没有来的缘故。 That’s why I object to the plan. 这就是我反对这个计划的原因。 That’s where you are wrong. 这就是你不对的地方。

动词以及动词短语的用法(动词后加to do 还是doing)

一动词加-ing 的情况 consider, suggest/advise,look forward to, excuse/pardon admit,delay/put off,fancy avoid,miss,keep/keep on,practise deny,finish,enjoy/appreciate forbid,imagine,risk can't help,mind,allow/permit,escape 考虑建议盼原谅, 承认推迟没得想. 避免错过继续练, 否认完成就欣赏. 禁止想象才冒险, 不禁介意准逃亡. 如:建议: 二动词后加 ①remember doing 的事,表示“不要忘记” ②forget doing。 ③mean doing表示“ ④regret doing 不是stop的宾语而是stop的目的状语。 ”,try to do表示“设法、试图做某事”。 go on to do表示做完一件事后,接下 三动词后加to do sth. afford负担得起agree同意appear似乎,显得arrange安排 ask问attempt企图beg请求begin开始 choose选择claim要求decide决定demand要求 desire愿望determine决定expect期望fail不能 forget忘记happen碰巧hate憎恨,厌恶hesitate犹豫 hope希望intend想要learn学习long渴望 love爱manage设法mean意欲,打算need需要 neglect忽视offer提供omit忽略,漏other扰乱;烦恼

STL有6种序列容器类型

1. STL有6种序列容器类型 (1)vector 它提供对元素的随即访问,在尾部添加和删除元素的时间是固定的,在头部或中部插 入和删除元素的复杂度为线性时间。 (2)deque 在文件中声明。 是双端队列,支持随即访问。从deque的开始与末尾位置插入和删除元素的时间是固 定的。 尽管vector和deque都提供对元素的随机访问和在序列中部执行线性时间的插入和删 除操作,但vector容器执行这些操作时速度更快一些。 (3)list 是双向链表,插入删除元素时间固定。不支持随机访问。 与vector不同是,当向容器中插入或删除元素后,链表迭代器指向元素将不变。 解释一下:如果一个vector有5个元素,中间插入一个,那么第五个元素包含的值将 是以前第四个元素的值,因此,迭代器指向的位置不变,但是数据不同。然而,在链 表中插入新元素并不会移动已有的元素,而只是修改链接信息。指向某个元素的迭代 器仍然指向该元素,也就是值相同,链接的位置不同了。 (4)queue 在头文件中声明。queue是一个适配器类,底层类默认为deque。 它不允许随机访问队列元素,甚至不允许遍历队列。 可以将元素添加到队尾,查看队尾和队首的元素的值,检查元素数目和测试队列是否 为空。 (5)priority_queue 与queue的不同是,最大的元素总是在队首,也是一个适配器类,默认的底层类是vector 。 可以修改用于确定哪个元素放在队首的比较方式,方法是提供一个可选的构造函数参数。 (6)stack 也是一个适配器类,默认的底层实现为vector。 不允许随机访问堆栈元素,甚至不允许遍历堆栈。 可以压入到栈顶,从栈顶弹出元素,查看栈顶元素的值,检查元素数目和测试堆栈是

动名词的用法详解

动名词的用法详解 今天给大家带来动名词的用法详解,我们一起来学习吧,下面就和大家分享,来欣赏一下吧。 英语语法:动名词的用法详解 动名词因同时拥有动词和名词两者的特点而拥有及其丰富 的用法,熟练的掌握这些用法不仅可以使口语表达更地道生动,也能在写作中增分添彩。 动名词主要有四种用法,做主语,作宾语,作表语,作定语,每种用法下又分小类别,是一个非常复杂庞大的系统,学习者们往往会理不清脉络,今天就为大家带来动名词的用法讲解。 一.作主语 1.直接位于句首 eg.Swimming is a good sport in summer. 2.用it作形式主语,把动名词(真实主语)置于句尾作后置主语。 eg.It is no use telling him not to worry.

.mportant,essential,necessary等形容词不能用于上述结构。 3.用于“There be”结构中 eg.There is no saying when hell come. 4.动名词的复合结构作主语: 当动名词有自己的逻辑主语时,常可以在前面加上一个名词或代词的所有格,构成动名词的复合结构,动名词疑问句通常使用这种结构做主语 eg.Their coming to help was a great encouragement to us. Does your saying that mean anything to him? 二.作宾语 1.作动词的宾语 某些动词后出现非限定性动词时只能用动名词作宾语,不能用不定式。不定式通常指某种特定的动作,但动名词表示泛指,常见的此类动词有: admit,appreciate,excuse,stand,advise,allow,permit,avoid,consider,e njoy,finish,give up,cannot help,imagine,include,keep,understand,keepon,mind,report,risk,mis s,put off,delay,practise,resist,suggest,depend on,think about,set about,succeed in,worry about,burst out,insist on,feel like,be used

C_vector类使用总结

C++中的vector使用范例 一、概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小。 例如: // c语言风格 int myHouse[100] ; // 采用vector vector vecMyHouse(100); 当如上定义后,vecMyHouse就可以存放100个int型的数据了。 1. 它可以像普通数组一样访问 eg: vecMyHouse[50] = 1024; 2. 你可以顺序地向容器中填充数据 eg:int i =0 ; for( ;i< 25; i++ ) { vecMyHouse.push_back(1); } 3. 它还可以动态地改变它的大小,通过下面这条语句实现 // 将容器的大小改为400,这样容器中就可以容纳400个int型数据了 eg:vecMyHouse.resize(400); 4. 你也可以在容器中装入自定义的数据类型 eg: // 自定义一个class class Cmyclass {

}; // 定义一个存放class的容器 vector vecMyHouse; 5. 你可以在定义容器时为它赋初值 // 定义一个容纳100个int型数据的容器,初值赋为0 vector vecMyHouse(100,0); 6. 你可以把一个容器的对象赋值给另外一个容器 eg: // 定义一个容纳100个int型数据的容器,初值赋为0 vector vecMyHouse(100,0); // 定义一个新的容器,内容与上述容器一样 vector myVec ; myVec = vecMyHouse; 二、以上是vector容器的简单介绍,下面将详细介绍它的其他功能: 1. 为了使用vector,必须在你的头文件中包含下面的代码: #include 2. vector属于std命名域的,因此需要通过命名限定,可以在文件开头加上using std::vector; 或者 using namespace std; 或者直接在使用vector的代码前加前缀 eg: std::vector myHouse; 3. vector提供如下函数或操作: 下面列举了部分常用的功能 // 定义一个vector std::vector c; // 可以使用的功能

的用法总结

I t的用法总结 一. 代词: 1)指代上文 2)指代this/that 3)指代未知性别的婴儿或孩子或身份不明的人 4)指代时间/地点/天气/温度/距离/环境 1.It gets dark very early in the winter. 2.What will you call it if it’s a boy 3.I love spring---It’s a wonderful time of the year. 4.It’s less than 100 kilometres from here to Jinan. 5.When the factory closes, it will mean 500 people losing their jobs. 6.What’s this It’s a cat. 7.It has snowed much this year. (1)The book in your bag is very interesting. Can I borrow (2) The book in your bag is more interesting than ______ on the desk. (3) The weather here is much colder than____ in Nanjing. (4) The books are free. You can take____ free of charge. (5) The books in the bag are better than _____ on the desk.

C++中vector的用法

C++Vector用法 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。要解决此问题我们自己实现这样的类。在标准C++中,用容器向量(vector)实现。容器向量也是一个类模板。 标准库vector类型使用需要的头文件:#include。vector是一个类模板。不是一种数据类型,vector是一种数据类型。Vector的存储空间是连续的,list不是连续存储的。 一、定义和初始化 vectorv1;//默认v1为空,故下面的赋值是错误的v1[0]=5; vectorv2(v1);或v2=v1;或vectorv2(v1.begin(),v1.end());//v2是v1的一个副本,若v1.size()>v2.size()则赋值后v2.size()被扩充为v1.size()。 vectorv3(n,i);//v3包含n个值为i的typeName类型元素 vectorv4(n);//v4含有n个值为0的元素 int a[4]={0,1,2,3,3};vectorv5(a,a+5);//v5的size为5,v5被初始化为a的5个值。后一个指针要指向将被拷贝的末元素的下一位置。 vectorv6(v5);//v6是v5的拷贝 vector<类型>标识符(最大容量,初始所有值); 二、值初始化 1>如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。 2>如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。 3>如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。 三、vector对象最重要的几种操作 1.v.push_back(t)在容器的最后添加一个值为t的数据,容器的size变大。 另外list有push_front()函数,在前端插入,后面的元素下标依次增大。 2.v.size()返回容器中数据的个数,size返回相应vector类定义的size_type的值。v.resize(2*v.size)或 v.resize(2*v.size,99)将v的容量翻倍(并把新元素的值初始化为99) 3.v.empty()判断vector是否为空 4.v[n]返回v中位置为n的元素 5.v.insert(pointer,number,content)向v中pointer指向的位置插入number个content 的内容。 还有v.insert(pointer,content),v.insert(pointer,a[2],a[4])将a[2]到a[4]三个元素插入。 6.v.pop_back()删除容器的末元素,并不返回该元素。

appreciate用法详解

appreciate用法详解 一、词义用法 1. 欣赏,赞赏 That’s because you can’t appreciate music. 这是因为你不能欣赏音乐。 I appreciate his generosity. 我赞赏他的慷慨大方。 2. 理解;体会 I appreciate the difficulty. 我理解这种困难。 I am afraid you don’t appreciate America. 恐怕你不理解美国。 3. 感谢,感激 I appreciate your goodness in calling. 我感谢你好心来访。 He appreciated their confidence. 他感激他们的信任。 二、后续宾语问题 其后可接名(代)词、动名词、名词性从句等作宾语,但不能接不定式。如:We shall appreciate hearing from you again. 能再次收到你的来信,我们将十分感激。 I appreciate that you have come here so 感谢你来得这么早。 注意:其后只能接“事”作宾语,而不能接“人”作宾语(注意:这与thank 的用法恰恰相反)。如: 正:I appreciate your kindness. 谢谢你的好意。 误:I appreciate you for your kindness. 正:He thanked her for her kindness. 他感谢她的好意。

误:He thanked her kindness. 三、后接if或when从句的问题 其后不直接跟if或when引导的从句,若语义上需要接这类从句,需借助it。如: I would appreciate it very much if you would help me with it. 如果你能帮助我做这事,我会十分感激。 We really appreciate it when she offered to help. 她来帮忙了,我们十分感激。 四、有关修饰语的问题 要表示程度,可用deeply, highly, (very) much 等副词修饰。如: I deeply appreciate your kindness. 我 谢你的好意。 He highly appreciated their help. 他非常感谢他们的帮助。 注意:much 修饰appreciate时,只能置于其前,而不能置于其后但very much 却可以): 我们非常感谢你的邀请。 正:We much appreciate your invitation. 正:We appreciate your invitation very much. 误:We appreciate your invitation much.

相关文档