`
hereson2
  • 浏览: 452050 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

几种STL容器的基本用法[资料]

J# 
阅读更多
一、原型与构造函数

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()把某一元素,求反。如vecObj[i].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:

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,al);
二、操作

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())的任意值。
分享到:
评论

相关推荐

    几种STL容器的基本用法

    几种STL容器的基本用法几种STL容器的基本用法

    STL入门快速入门教程-----学习C++

    STL重要部分,包含了许多数据结构,有vector(动态增加的数组),queue(队列),stack(堆栈)……甚至也包括string,它也可以看做为一种容器,并且适用所有的容器可用的方法。 7:算法(algorithms)部分。STL重要...

    coding-interview-cpp:简洁的竞赛节目采访准备材料

    介绍该存储库包含有助于对涉及竞争性编程的采访进行编码的资源集合。 目前仅在C ++中支持该内容。 由于已经在线提供了大量资料,因此下面... 学习STL,挽救生命说明了几个STL类的用法。 为了方便和易于学习,还提供了示

    c++面试题基础分享.doc

    27.列举几种进程的同步机制,并比较其优缺点 28.数组和链表的区别 29.MFC主要要用到哪几个类?及其各个类的作用 30.MFC六大核心机制 31.OnDraw和OnPaint 32.win32程序的消息响应机制是如何实现的 33.MFC中的...

    传智播客扫地僧视频讲义源码

    06_数组指针类型和定义数组指针变量的3种方法 07_多维数组名本质剖析_传智扫地僧 08_多维数组的【】和多级指针星号转化推演 09_多维数组做函数参数技术推演和退化原因抛出 10_多维数组做函数参数退化总结_ 11_指针...

    safe-map:安全的

    有几种方法可以解决此问题。 例如,英特尔的TBB包含多个“线程安全”容器。 不幸的是,您会发现它们对保留迭代器也不起作用-它们仅确保原子操作。 另一种选择是跳过使用迭代器,仅存储密钥。 但这意味着每次您要...

    摩托罗拉C++面试题

    5.参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么; 传值,传指针或者引用 6.结合一个项目说明你怎样应用设计模式的理念。 设计模式更多考虑是扩展和重用,而这两方面很多情况...

    CascadiaPackage.zip

    主要是将逻辑实体清晰地划分为模块和类,引入了一些关键的扩展点,用更安全、更高效的STL容器替换了几个旧的、自制的集合和容器,并通过使用微软的 Wil header 库使代码更简单、更安全。 这项大修工作导致创建了几...

    C++程序设计彻底研究(是code不是书)

    24.3 使用STL的vector·容器类 24.4 使用STL处理字符串数组 24.5 使用complex容器类处理复数数据 24.6 常犯的错误 24.7 本章重点 24.8 本章练习 第25章 最优化问题的求解 25.1 最优化问题 25.2 Simplex最...

    leetcode会员降价-cpp:该库主要包括C++的基础语法以及C++11新特性等相关知识点的代码

    leetcode会员降价 cpp 此学习笔记来源于,库中目前包含的有以下知识 ...学习mysql数据库的基本操作,如库操作,表操作,约束,查询练习,四种连接查询和事务 未来工作: C++11新特性的理解 网络编程的知识巩固 设计模

    vc++ 应用源码包_5

    自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、...

    vc++ 应用源码包_1

    自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、...

    vc++ 应用源码包_2

    自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、...

    vc++ 应用源码包_6

    自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、...

    vc++ 应用源码包_3

    自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    19.1.5 其他几种迭代器 565 19.2 容器 566 19.2.1 连续容器 566 19.2.2 容器适配器栈和队列 570 19.2.3 关联容器集合和映射 572 19.2.4 效率 575 19.3 泛型算法 576 19.3.1 运行时间和大O记法 576 19.3.2 ...

    vc++ 开发实例源码包

    自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、...

    基于C++开发的射击游戏

    解决这个问题有几个方法,其中有一个方法是利用计算机图形学上的Bresenhem直线算法。该算法用于计算机画平面上的直线,算法如下: |m|的情况 1、输入线段的两个端点,并将左端点存储在(x0,y0)中; 2、将(x0,y0)装入...

Global site tag (gtag.js) - Google Analytics