C++容器类的简介

一、原型与构造函数

Vector的原型可定义为

vector<T, allocator <T> >

其构造函数为

vector()             //空的

vector(al)          //指定一种allocator

vector(n)          //用默认T()初始化n个元素

vector(n, val)   //用Val初始化n个元素

vector(n,val,al)         //用val初始化n个元素,用al做分配器

vector(first,last)       //从己有的first到last复制生成

vector(first,last,al) //从己有的first到last复制生成,用al做分配器

二、操作

1.开辟N个空间

vecobj.reserve(N);

2.当前(又一次分配内存前)得到最大容量

capacity();

3.又一次分配内存为N

resize(N)

假设变小,则删除多余。假设变大,则用T()添充

4.清空

clear();

注意,clear()和resize()都不一定使得vector变小,若欲释放内存,请使用vecobj.swap(vector<T, A>())

5.存取首尾元素

front()与back()操作,取后一个和最前一个元素,注意其返回是引用,其而是左值(l_value),因此能够赋值. 做相似于vecobj.front() = 3;的操作,但要保证front空间有效,否则形为无法预測。

6.取值

[]与at能够做此操作,at会检查,假设越界有会out_of_range的异常被throw

7.push_back, pop_back

要保证不为空

8.使用assign

assign能够改变大小和初值,大小是任意的,不受開始时大小的限制,假设设置为0,则清空。

assign(5,0)把vector改为5个大小,并用0添充

assign(iax+3,iax+5); 从数组第4到5个填充,注意左闭右开,就可以取到iax[3]与iax[4]

9.使用insert

insert(it, x),在it前插入一个元素x

insert(it,first,last),在it前插入一个序列[first,last)左闭右开

10.使用erase

erase(it)删除在it处的元素,返回值为下一元素。假设intVec.erase(intVec.end());并不会报错,假设删除一个序列[first,last),使用erase(first,last)

11.BVector是vector<bool>的特化版,详细的用途有待查证

12.flip()把某一元素,求反。

13.swap. vecObj.swap(vecObj[i],vecObj[j]);

若要在容器中装一个对象而且能并检索,须要重载operator == ,例如以下:

#include <vector>

#include <iostream>

#include <stdlib.h>

#include <time.h>

//#include <getopt.h>

using namespace std;

class Obj

{

public:

Obj(int x, int y, int z)

{

this->x = x;

this->y = y;

this->z = z;

}

bool operator == (const Obj & obj)

{

if(obj.x == x && obj.y == y && obj.z == z)

return true;

return false;

}

int getX()

{

return this -> x;

}

private:

int x;

int y;

int z;

}

int main(int argc, char * argv[])

{

vector<Obj> vecObj;

Obj obj1(2,3,4);

Obj obj2(4,5,6);

vecObj.push_back(obj1);

vecObj.push_back(obj2);

vector<Obj>::iterator it =find(vecObj.begin(),vecObj.end(),Obj(2,3,4));

if(it != vecObj.end())

cout << (*it).getX() << endl;

return 0;

}

list的基本使用方法

与vector的使用方法基本同样,当中须要强调一点的是splice()函数,是指把指定段的还有一个List插入到指定位置的前面。

splice(iterator it , list &x)

splice(iterator it, list &x, iterator first)

splice(iterator it,list &x, iterator first, iterator last)

一、原型与构造函数

typdef list<T, allocator<T> >  listObj;

构造函数

list() //空

list(al) //指定allocator的空表

list(n)//n个元素,全部元素都是T()出来的

list(n,val)//n个元素,全部元素都是T(val)出来的

list(n,val,al)//同上,并指定allocator为al

list(first, last) //复制构造

list(first,last,al) //指定allocator构造

二、操作

1.resize & clear

使用resize(n)改变大小,使用resize(n, val)假设须要用T(val) 来填满空暇值。

2.front ()& back()

假设listObj很量对象,返回是一个左值函数

3.插入操作

insert(iterator it , val)

insert(iterator it, first, last)

insert(iteratot it, n, x)//插入n个x

4.移除

remove(x); //vector.erase(integrator it)

按值删

int iax[] ={3,4,5,6,6,7,8}

list<int> lObj;

lObj.insert(lObj.begin(),iax, iax + 7);

lObj.remove(6); //

按函数条件删

#include <iostream>

#include <list>

using namespace std;

// a predicate implemented as a function:

bool single_digit (const int& value) { return (value<10); }

// a predicate implemented as a class:

class is_odd

{

public:

bool operator() (const int& value) {return (value%2)==1; }

};

int main ()

{

int myints[]= {15,36,7,17,20,39,4,1};

list<int> mylist (myints,myints+8);   // 15 36 7 17 20 39 4 1

mylist.remove_if (single_digit);      // 15 36 17 20 39

mylist.remove_if (is_odd());          // 36 20

cout << "mylist contains:";

for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)

cout << " " << *it;

cout << endl;

return 0;

}

当然,对于class is_odd,也能够写成

template <class T>

class is_odd

{

};

调用时,则要改成

mylist.remove_if(is_odd<int>());

5.unique操作

// list::unique

#include <iostream>

#include <cmath>

#include <list>

using namespace std;

// a binary predicate implemented as a function:

bool same_integral_part (double first, double second)

{ return ( int(first)==int(second) ); }

// a binary predicate implemented as a class:<

pre>class is_near

{

public:

bool operator() (double first, double second)

{ return (fabs(first-second)<5.0); }

};

int main ()

{

double mydoubles[]={ 12.15, 2.72, 73.0, 12.77, 3.14,

12.77, 73.35, 72.25, 15.3, 72.25 };

list<double> mylist (mydoubles,mydoubles+10);

//UNIQUE曾经必需要Sort,切记,它的内部实现是I,i+1的方式。

mylist.sort();             // 2.72, 3.14, 12.15, 12.77, 12.77,

// 15.3, 72.25, 72.25, 73.0, 73.35

mylist.unique();           // 2.72, 3.14, 12.15,

12.77

// 15.3, 72.25, 73.0, 73.35

mylist.unique (same_integral_part); // 2.72, 3.14, 12.15

// 15.3, 72.25, 73.0

mylist.unique (is_near());           // 2.72, 12.15, 72.25

cout << "mylist contains:";

for (list<double>::iterator it=mylist.begin(); it!=mylist.end(); ++it)

cout << " " << *it;

cout << endl;

return 0;

}

6.排序操作

sort(); //默认按operator <排序,从小到大

sort(pr); //pr为Functional函数

7.Merge操作

在merge操作前,须要对两个序列都用operator <排序,当然,也能够指定pr排序函数

merge(s2)

merge(s2,pr);

8.reverse()

翻转操作,把整个list翻转

deque的基本操作

一、原型与构造函数

typedef deque<T, allocator<T> > deqObj;

构造函数

deque();

deque(al);

deque(n);

deque(n,x);

deque(n,x,al);

deque(first,last);

deque(first,last,

二、操作

1.resize & clear

使用resize(n)改变大小,使用resize(n, val)假设须要用T(val) 来填满空暇值。

2.clear操作

在clear后调用deqObj.swap(deque<T,A>())是好习惯,并且也一定要这么做。

3.font(),back(),operator [],(如出边界,形为未定)at()(如出边界,抛异常),push_back(),push_front(),pop_back(), pop_front(),insert(iterator it,x),insert(iterator it,n,x),insert(iterator first,iterator last),(插入后指向刚插入的值),erase(it),删除在it指定位置的值,erase(iterator first,iterator last)删除指定区间的值(左闭右开)。这些操作与上面的操作雷同。

Set与multiset的基本操作

一、原型与构造函数

typedef set<Key, less<Key>, allocator<key> > setObj;

构造函数

set(); //空set,按pred()排序

set(pr); //声明一个空的按pr排序的set

set(pr,al); //声明一个按pr排序的集合用al分配

set(first,last)

set(first,last,pr)

set(first,last,pr,al)

操作

1.clear()

2.erase(it); erase(first, last)

3.insert(key),返回值为pair<iterator, bool> 类型,没有与插入元素同样的元素时,second为true,此时first指向新插入的元素。否则为False,first仍指向原来的元素

4.find(key)

5.lower_bound(key)

6.upper_bound(key)

7.equal_range(key),返回一个pair<iterator , iterator >(lower_bound(key), upper_bound(key))

8.count, equal_range的长度

9.key_comp,假设k1排在k2的前面,那么key_comp()(key1,key2)就为true

10.value_comp,对于set<key>对象,它与key_comp一样。

multiset

1.insert,因为insert总能成功,那么它返回的就是新元素的迭代器,而并不是pair<iteraor, bool>对象.

2.find返回第一个与key相等的迭代器。

3.equal_range将返回 [0,setObj.size())的随意长度.

4.count()将返回[0,setObj.size())的随意值。

C++容器类的简介的更多相关文章

  1. 【Flutter】容器类组件简介

    前言 容器类Widget和布局类Widget都作用于其子Widget,不同的是: 布局类Widget一般都需要接收一个widget数组(children),他们直接或间接继承自(或包含)MultiCh ...

  2. c# 容器类简介

    c# 容器类简介   C# 中主要有两类容器:一个是 System.Array 类(参阅:http://msdn.microsoft.com/library/default.asp?url=/libr ...

  3. 第15.33节 PyQt(Python+Qt)入门学习:containers容器类部件QTabWidget选项窗部件简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  4. 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  5. Java集合容器简介

    Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...

  6. tomcat 简介

    一,Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项 ...

  7. c++模板库(简介)

    目 录 STL 简介 ......................................................................................... ...

  8. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

  9. Java容器类概述

    1.简介 容器是一种在一个单元里处理一组复杂元素的对象.使用集合框架理论上能够减少编程工作量,提高程序的速度和质量,毕竟类库帮我们实现的集合在一定程度上时最优的.在Java中通过java.util为用 ...

随机推荐

  1. XmlDocument类

    XmlDocument类是.NET框架的DOC解析器.XmlDocument将XML视为树状结构,它装载XML文档,并在内存中构建该文档的树状结构.下面来看下XmlDocument提供了哪些功能. 一 ...

  2. grep 同时满足多个关键字和满足任意关键字

    grep 同时满足多个关键字和满足任意关键字 ① grep -E "word1|word2|word3"   file.txt    满足任意条件(word1.word2和word ...

  3. c# 控件闪烁处理方法

    如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在更新的时候都会不断地闪烁,解决方法就是在这个窗体的构造函数中增加以下三行代码:请在构造函数里面底下加上如下几行:SetStyle(Co ...

  4. bzoj1061: [Noi2008]志愿者招募

    线性规划与费用流.http://www.cnblogs.com/iiyiyi/p/5616080.html.数组范围开错了!!!然后2.31-1=0x7fffffff!=0x7f7f7f7f. 开始以 ...

  5. [CF 471C] MUH and House of Cards

    C. MUH and House of Cards   Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elep ...

  6. Entity Framework Code First级联删除

    如果我们要到一对主从表增加级联删除,则要在主表中的引用属性上增加Required关键字,如: public class Destination { public int DestinationId { ...

  7. Entity Framework 数据生成选项DatabaseGenerated

    在EF中,我们建立数据模型的时候,可以给属性配置数据生成选项DatabaseGenerated,它后有三个枚举值:Identity.None和Computed. Identity:自增长 None:不 ...

  8. HDU 4389 X mod f(x)

    题意:求[A,B]内有多少个数,满足x % f(x) == 0. 解法:数位DP.转化为ans = solve(b) - solve(a - 1).设dp[i][sum][mod][r]表示长度为i, ...

  9. 如何查看.Net FrameWork,VC++ 等安装包的启动参数

    最近做了一个客户端的程序,客户端程序运行环境要求是.Net FrameWork 4.0 和VC++ 2012 ,在做安装包的时候需要先检测系统环境是否存在这些环境,不存在则安装对应环境. 使用工具来制 ...

  10. warden 的设计与实现 总结

    --------------------------------------------------------参考资料---------------------------------------- ...