`
kevin2123
  • 浏览: 8184 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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>());

 

分享到:
评论

相关推荐

    c++容器类&QT;容器

    ### C++ 容器类与 Qt 容器详解 #### C++ 容器类概述 在C++标准库中,容器类(containers)是用于存储数据的重要组件之一,它们为程序设计提供了高度灵活且功能丰富的数据管理手段。根据数据的组织形式不同,C++中...

    编程C++容器类资料

    在C++编程中,容器是STL(标准模板库)的核心组成部分,它们是用于存储、组织和管理数据的模板类。这些容器提供了高效且灵活的数据结构,使得开发者能够...因此,这份C++容器类资料是学习和提升C++编程技能的宝贵资源。

    C++容器类的简单介绍.doc

    C++中的容器是STL(Standard Template Library,标准模板库)的核心组成部分,它们提供了一种组织和管理数据的方式。在C++中,容器分为两类:顺序容器和...正确地利用C++的容器类可以极大地提高代码的效率和可维护性。

    浅谈C++容器.pdf

    ### C++容器概念及其基础知识解析 #### 一、引言 C++作为一种广泛使用的编程语言,在软件开发领域占据着举足轻重的地位。其强大的功能不仅体现在基础语法上,更在于其丰富的标准库支持,尤其是标准模板库(STL)中的...

    c++容器的使用+代码.pdf

    C++容器的使用详解 C++容器是C++标准模板库(STL)中的一部分,提供了多种数据结构,用于存储和管理数据。在C++中,容器分为三类:顺序容器、关联容器和容器适配器。 顺序容器 顺序容器按照元素的顺序存储,支持...

    C++类模板&&容器&&重载

    接下来,我们讨论**C++容器**。C++标准库中提供了丰富的容器,如`std::vector`、`std::list`、`std::set`和`std::map`等,它们都是模板类,用于存储和管理对象集合。每个容器都有其特定的特性和性能特征,适用于不同...

    C++-container

    C++容器类可以通过多种方法实现: 1. **即兴(Ad hoc)**:每次从零开始重写,这种方法虽然灵活,但效率低下且容易出错。 2. **预处理器宏(Preprocessor Macros)**:通过宏来实现代码的重复利用,但可读性和可...

    C++ API文档

    通过深入学习C++ API文档,开发者能够熟练掌握C++容器类的使用,提高代码质量,优化程序性能,从而在软件开发过程中更加得心应手。同时,对API的深入理解也有助于更好地利用STL提供的工具,遵循“不要重复发明轮子”...

    C++容器与队列

    在 C++ 的标准库(Standard Template Library, STL)中,提供了丰富的容器类和算法,极大地提高了程序设计的效率和代码的可读性。本文将详细介绍 C++ 中的容器之一——`vector` 向量容器以及相关的队列概念。 #### ...

    C++容器中的输出流

    首先,我们来看一下标题中的“C++容器中的输出流”。 输出流在C++中主要通过`std::ostream`类及其派生类来实现,如`std::cout`用于控制台输出。容器,如`std::vector`, `std::list`, `std::set`等,可以与输出流...

    c++容器详解

    在C++中,类和对象是面向对象编程的基础,而容器则是在这些基础上提供的一种数据结构,用于高效地存储和操作数据。下面我们将深入探讨这些知识点。 首先,类是C++中定义对象行为和属性的蓝图。在给定半径求圆面积的...

    浅谈C++容器

    C++容器是C++标准模板库中提供的一组通用的容器类,总共有10种,它们可以解决程序中遇到的许多问题。这些容器的实现都是基于数据结构的基本知识,它们是对数据结构的实例化。因此,了解数据结构的概念是非常重要的。...

    C++编程思想/模板和容器类

    【C++编程思想/模板和容器类】 C++中的模板是一种强大的工具,它允许程序员创建泛型代码,即代码能够处理多种数据类型。模板的概念在C++中扮演着至关重要的角色,尤其是对于实现容器类,如向量、列表、集合等。容器...

    c++STL学习——各种容器的技术总结和用法代码实例

    C++ STL中的容器是一些类模板,用于存储和管理元素集合。常见的容器有向量(vector)、列表(list)、双向链表(deque)、集合(set)、映射(map)、无序集合(unordered_set)和无序映射(unordered_map)。每种...

    掌握c++标准类

    综上所述,掌握C++标准类涉及多个方面,包括但不限于理解容器的使用、迭代器的遍历、算法的应用、函数对象的编写、模板的使用以及异常处理的技巧。只有深入学习并熟练运用这些知识点,才能真正地称得上掌握了C++标准...

    基于C++的线程安全容器。.zip

    本项目以C++为基础,旨在实现一套线程安全的容器类,可能包括线程安全的栈、队列、列表或其他容器。这些容器通常会利用C++的互斥量(mutex)、条件变量(condition variable)等同步原语来保证在多线程环境下的正确...

    tree(c++ tree容器)

    标题提到的"tree(c++ tree容器)"是一个第三方实现,旨在为C++开发者提供一个类似于STL接口的树容器,方便用户在项目中构建和操作树形数据。 这个源码库的亮点在于它的用法与C++标准库中的其他容器类似,如vector和...

    面向对象程序设计C++自定义类模板

    自定义类模板内容很全,用到了大部分数据结构的知识 ...1.容器类模板:顺序表、链表、栈、队列、映射表 2.函数模板:冒泡、快速排序、堆排序、顺序查找、二分查找 3.应用:(1)四则表达式的运算(2)图的广度遍历

    容器类实现的电话本

    实现电话号码本的管理和查询功能。号码本内预先存储了若干条联系人记录,记录内容包括联系人姓名和电话号码。...必须使用容器类作为内部数据结构,可自行选择合适的容器类; 必须把联系人记录定义成一个类;

    HwTest1.7z

    总结起来,“HwTest1.7z”项目是关于如何使用C++和SQLite3进行数据操作的一个实例,其中涉及了数据库的基本操作以及C++容器类的运用,对于学习C++编程和数据库操作的人来说是一个很好的实践案例。

Global site tag (gtag.js) - Google Analytics