精华内容
下载资源
问答
  • 可以用来做统计文字出现次数的容器 SortedMap TreeMap 遍历容器的方法: 1. for循环Iterator 为什么重写类中的equals方法必须重写hashcode 将对象放到集合(set、map)时会涉及对比hashcode的情况...

    Collection(集合)

    对应的工具类Collections,包含排序、洗牌等操作

    List

    ArrayList

    本质是Object数组

    private transient Object[] elementData

    默认数组的长度为10

    add时超过10则数组长度增加原来长度的一半

    list变数组:(T[])list.toArray(newT[list.size()]);

     

    LinkedList

    本质是双向的链表

    private static  class  Node<E>{

            E item;

            Node<E> next;

           Node<E> prev;

    }

    add是new Node 节点,然后关联起来

    Set(同数学上的集合,元素不重复)

    HashSet

    本质是HashMap

    private transient HashMap<E, Object>map ;

    add时用key来存值,value为一个object对象

    可以用来做随机抽奖的容器

    sortedSet

    TreeSet

    本质是 TreeMap

    构造时可以加入comparator 参数,自定义定义排序规则

    add时用key来存值,value为一个object对象

    Map(字典)

    HashMap

    本质是Entry数组和单向链表的结合

    transient Entry[] table

    static Entry <K,V> implementsMap.Entry<K,V>{

           final K key;

           V value;

           Entry<K,V> next;

           Final int hash;

    }

    默认数组长度为16

    增加容量时2倍增加

    put元素时,会先对比hash值和equals内容。判断键值是否相等。

    如图:


    可以用来做统计文字出现次数的容器

    SortedMap

    TreeMap

    遍历容器的方法:

    1. for循环Iterator

    为什么重写类中的equals方法必须重写hashcode

    将对象放到集合(set、map)时会涉及对比hashcode的情况。如果不重写调用的hashcode方法则会调用object类的hashcode方法(对象的地址),这样会造成内容相同的对象,在内存地址不同的情况下,会被存入set、map中。但是集合中要求对象中的内容不能重复的。这样就矛盾了

    展开全文
  • c++中我相信大家经常要用到STL里面的各种容器存放自己的数据,既然我们用的这么频繁那么就相应该有一些疑问?

    ~~~~我的生活,我的点点滴滴!!                  

                c++中我相信大家经常要用到STL里面的各种容器来存放自己的数据,既然我们用的这么频繁那么就相应该有一些疑问?

     1.容器里面什么时候应该存指针?
     2.容器里面什么时候应该存对象?
     3.容器怎么在遍历的时候删除某元素?
     4.容器应该怎么释放掉?


     一.分析一下STL里面工作方式
                  对于内建类型(int float char等),容器的工作方式是纯粹的位拷贝,这里没有什么需要多说的。
    对于自定义的对象,容器容纳了对象(比如通过insert或push_back等),但容器中存放的对象不是你给它们的那个对象,因为两个对象在内存中的位置不一样。此外,当你从容器中获取一个对象时,你所得到的对象不是容器里的那个对象。取而代之的是,当你向容器中添加一个对象(比如通过insert或push_back等),进入容器的是你指定的对象的拷贝。拷进去,拷出来。拷贝是STL的方式。可以通过自己写一个例子打印出地址来看。


    二.存放对象的情况
                 明白了容器的工作方式,那么进一步来讨论容器存放对象和指针在操作过程中的开销。内建类型的数据进行拷贝的方式是位拷贝,自定义类型的数据进行拷贝会调用类的拷贝构造函数,这个函数是每个类都有的,如果类中没有显式的声明那么编译器也会给提供一个默认的拷贝构造函数。如果一个类的数据非常多,或者包含其他复杂自定义类型,那么此时类的拷贝构造的开销是非常大的。
    此时容器中要是存放的是对象vector,那么一个简单的插入操作的代价也是惊人的,更别说什么排序之类的操作,很容易带来性能上的瓶颈,这个时候就需要在容器中存放对象的指针vector,这样的话就避免了这些多余的拷贝消耗,因为指针就是一个机器字长,拷贝的代价可以忽略不计。

    typedef std::vector ObjectVector;
    
    typedef std::vector PointerVector;
    
    //下面是存贮对象的情况
    
    begin = GetTickCount();
    
    ObjectVector objectVector;
    
    for (int i = 0; i < MAX; i++)
    {
    
    <span style="white-space:pre">	</span>objectVector.push_back(*pCom);
    
    }
    
    end = GetTickCount();
    
    cout << "存放对象消耗的时间:";
    
    cout << end - begin << "毫秒 ";
    
    
    
    //下面是存贮指针的情况
    
    begin = GetTickCount();
    
    PointerVector pinterVector;
    
    for (int i = 0; i < MAX; i++)
    
    {
    
    	pinterVector.push_back(pCom);
    
    }
    
    end = GetTickCount();
    
    cout << "存放指针消耗的时间:";
    
    cout << end - begin << "毫秒 ";

    下面的结果是在Release版本下,并且编译器的优化关闭的情况下,这和我们目前的客户端设置一样:

    MAX = 4000


    MAX = 40000


    MAX = 400000


    上面的数据没有用统计学的方法去测试,只是取了一次结果,我测试了多次结果在数量级上是一样的(用上面的数据只是说明拷贝的代价是巨大的,并没有强调必须用指针)。
                   分析完了拷贝的性能消耗,再看看另一个问题,就是声明了一个存放基类对象的容器,如果此时向容器中插入子类的对象,那么子类特有的那些内容就会被无情剥离(slicing)。这是一个很严重的问题。解决的方法还是使用基于指针的容器。


    三.存放指针的情况

                   上面提到的两个问题用指针确实比用对象好,问题不是这么绝对。在上面考虑拷贝消耗的时候有个前提:如果一个类的数据非常多,或者包含其他复杂自定义类型,并且需要大量的使用需要容器内部对象拷贝的操作。如果一个对象中就是几个简单的内建类型,或者干脆就是一个简单的内建类型的数据,那么再用指针可真是得不偿失了,因为使用指针需要程序员去管理内存。完全没有必要为了节省几个int类型的拷贝消耗而去自己去做内存的管理,确实完全没有必要。用指针就需要自己手动的去管理这些指针所指向的内存,stl容器确实可以动态申请内存使自己变大以容纳更多的元素,但这些动态空间存放的是你的指针,而并不是你指针指向的动态内存,你的指针内存当然需要你去管理,如果实在不想做这些管理工作,可以去使用智能指针。


    四.总结一下存指针与对象

    1.stl容器可以存放内建类型、自定义类型、指针类型的元素。

    2.元素如果是内置数据类型,那么就存放数据本身。

    3.元素如果是复杂类型,并且在使用容器的过程中需要容器的元素进行大量的拷贝操作的时候,就要考虑在容器中放入指针;

    4.存放指针容易出现内存的泄露,所以在使用的时候需要考虑清楚,如能接口设计的合理,能保证容器在使用的过程中不进行大量的拷贝工作,在容器中存放对象是最好的了。

    5.使用智能指针是一种两种优点都兼备的,既有指针的操作效率,又避免了自己手动管理内存带来的问题。

    6.指针可以解决派生类对象存放在使用基类实例化的容器中的剥离(slicing)问题。
    在考虑容器中是存放对象还是指针的时候脑子里时刻要想到,我的操作需要容器做多少拷贝工作,这些拷贝操作带来的损耗能否接受,从这个本质问题上把握好了,选择起来就不是问题了,要根据实际情况灵活运用。


    五. STL遍历过程中删除元素

    如果想在容器遍历过程中删除里面某个值时,用迭代器(这是最简单的方法),看下面代码:

    std::list< int> List;
    std::list< int>::iterator itList;
    for( itList = List.begin(); itList != List.end(); )
    {
    if( WillDelete( *itList) )
    {
       itList = List.erase( itList);
    }
    else
      itList++;
    }
    或者:
    std::list< int>::iterator itList;
    for( itList = List.begin(); itList != List.end(); )
    {
    if( WillDelete( *itList) )
    {
       List.erase( itList++);
    }
    else
       itList++;
    }

    重点是当删除后就要往后移一位,不然下次遍历到那时,已经不存在,就会报错的。


    六. STL中删除元素释放问题

                   STL中不管是erase或remove都不会释放对象的内存空间,他只是释放了STL里面用来存放这个对象或指针的空间,所以依然需要自己去手动释放,并且释放是有先后顺序的,要先delete 在调用STL里容器对应的erase函数。

    list<obj *>m_list;
    list<obj *>::iterator ite;
    for( ite = m_list.begin(); ite != m_list.end(); ++ite)
    {
    	delete (*ite);
    	ite = m_list.erase(ite);
    }
    
    总之一条原则, 你 new 的, 你去 delete 释放。不是你 new 的, 就不该你去释放。你往 list 里面插入元素时所需的内存是 list 自己申请的, 那它就会自己释放。但是你存在里面的对象不是他的,他不会管!



    展开全文
  • Python中容器指的是什么

    千次阅读 多人点赞 2019-06-30 23:06:17
    容器容器是一种把多个元素...容器仅仅只是用来存放数据的,我们平常看到的 l = [1,2,3,4]等等,好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。 ...

    容器:容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。

    1. 容器是一种可以包含其他类型对象(如列表、元组、字典等)作为元素的对象;
    2. 容器仅仅只是用来存放数据的,我们平常看到的 l = [1,2,3,4]等等,好像我们可以直接从列表这个容器中取出元素,但事实上容器并不提供这种能力,而是可迭代对象赋予了容器这种能力。

    具体相关知识可以参考《 基础知识进阶 第4.1节 Python基础概念之迭代、可迭代对象、迭代器》

    老猿Python,跟老猿学Python! 博客地址:https://blog.csdn.net/LaoYuanPython

    展开全文
  • 首先STL容器中最好是不要存放指针,如果外部被new出来的对象被销毁了,那么存放容器中的指针就变成空指针了,这样在遍历的时候,就爆炸了。但是在STL容器存放指针也有他的好处。首先是在容器中放入对象:#...

    首先STL容器中最好是不要存放指针,如果外部被new出来的对象被销毁了,那么存放在容器中的指针就变成空指针了,这样在遍历的时候,就爆炸了。

    但是在STL容器中存放指针也有他的好处。

    首先是在容器中放入对象:

    #include<iostream>
    #include<vector>
    using namespace std;
    class A
    {
    public:
    	A() { std::cout << "Agouzao" << std::endl; };
    	~A() { std::cout << "Axigou~!" << std::endl; };
    
    };
    int main()
    {
    	std::vector<A>_a;
    	A * a = new A();
    	A* a2 = new A();
    	A * a3 = new A();
    	A* a4 = new A();
    	_a.push_back(*a);
    	_a.push_back(*a2);
    	_a.push_back(*a3);
    	_a.push_back(*a4);
    	delete a;
    	/*for (auto value : _a)
    	{
    		delete value;
    	}*/
    	//_a.clear();
    	return 0;
    }

    先来看看现象,在vector析构后。调用了A的析构函数。按正常套路来析构,应该是析构10次,但是注意我上面手动delete 了一个a,这样的话就是调用11次析构函数。

    也就是说当我Vector里面放对象的时候,我Vector析构的时候,只清理了我vector里面的构造的对象,并没有清理我堆上自己new出来的对象。

    然后,我们在Vector里面来放指针。

    #include<iostream>
    #include<vector>
    using namespace std;
    class A
    {
    public:
    	A() { std::cout << "Agouzao" << std::endl; };
    	~A() { std::cout << "Axigou~!" << std::endl; };
    
    };
    int main()
    {
    	std::vector<A*>_a;
    	A * a = new A();
    	A* a2 = new A();
    	A * a3 = new A();
    	A* a4 = new A();
    	_a.push_back(a);
    	_a.push_back(a2);
    	_a.push_back(a3);
    	_a.push_back(a4);
    	
    	for (auto value : _a)
    	{
    		delete value;
    	}
    	//_a.clear();
    	return 0;
    }

    可以通过For_each算法来把vector里面的对象delete掉,这样就可以来控制类的生命周期。

    心得:

    STL容器中存放指针有好有坏。

    好处:可以用来解决类的关系,比如实现组合关系。

    坏处:容易出现空指针。

    所以在使用的时候要小心。




    展开全文
  • 同步类容器和并发类容器

    万次阅读 多人点赞 2019-07-31 19:22:20
    什么会出现同步容器? 在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。 注意Collection和Map是顶层接口,而List、Set、Queue接口则分别继承了Collection接口,分别代表数组、集合和队列这三大...
  • Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类。 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构。 我们可以通过创建引用来持有对象,如 ...
  • stl学习笔记2(容器,函数对象

    千次阅读 2006-12-11 20:45:00
    3 组件二:容器你可以生成STL容器用来存放对象或者指向对象的指针。 class TMyClass;typedef list TMyClassList; // 用于存放对象的list容器typedef list TMyClassPtrList; // 用于存放对象指针的list容器 如果...
  • 它的主要目的之一就是用来指定容器要持有什么类型对象 泛型只能只能代表引用类型,不能是原始类型,原始类型有byte/short/int/long 浮点型:float.double 字符型char 布尔型:boolean,引用类型与原始类型的区别...
  • 深入理解Java中的容器

    万次阅读 多人点赞 2016-07-27 17:25:40
    在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 2、容器与数组的关系 之所以需要容器: 1、数组的...
  • Flex中改变对象容器中的叠放层次

    千次阅读 2014-11-25 19:22:58
    关键字: flex中改变对象容器中的叠放层次1、在容器中添加对象、移除对象和检测容器中是否存在对象 容器对象.addChild(显示对象);//在容器中添加对象 容器对象.removeChild(显示对象);//在容器中删除对象 容器...
  • 在java中有两个容器来EnumSet和EnumMap,其他的方法看文档中对应的API。...EnumSet:EnumSet和普通的Set差不多,但是他是专门用来存放枚举类型的数据的(枚举类型都是有限的)。所以他的内部是由一个bit ve
  • C++中vector容器

    千次阅读 2018-07-30 16:53:46
    容器用来存储数据的,数据可以是用户自定义类型对象),也可以是预定义类型。 2.vector: vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被...
  • Java集合容器面试题(2020最新版)

    万次阅读 多人点赞 2020-03-01 11:08:34
    文章目录集合容器概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些?List,Set,Map三者的区别?List、Set、Map 是否继承自 Collection 接口?List、Map、Set 三个接口存取元素时,各...
  • Java 容器与数组

    千次阅读 2014-08-31 14:35:55
    数组和其它容器的区别主要有三个:效率,类型,和存放基本类型的能力.JAVA中的数组是一种效率最高的存储和随机访问对象引用序列的方式.它就是一个简单的线性序列,所以访问是非常快.但它也损失了其他的特性.当创建一个...
  • 数据库中的blob是什么类型

    千次阅读 2019-06-11 15:08:00
    数据库中的blob是什么类型?  BLOB (binary large object)----二进制大对象,是一个可以存储二进制文件的容器。  在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。  BLOB是一个大文件,典型...
  • [转]C++ 容器中存入”指针“及对象析构问题  (2012-09-20 23:32:20) 转载▼ 标签:  杂谈 分类: C相关 【转自】:http://blog.sina.com.cn/s/blog_4b3c1f950100kgps.html ...
  • 容器

    千次阅读 2020-06-30 07:33:56
    Collection 和 Collections 有什么区别? java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。...
  • Java高级部分容器重点总结上

    千次阅读 2015-12-25 09:07:11
    在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,或者就叫做集合,集合就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 容器一定是类,但类不一定是容器 3...
  • 在spring Web中,需要初始化IOC容器,用于存放我们注入的各种对象。当tomcat启动时首先会初始化一个web对应的IOC容器,用于初始化和注入各种我们在web运行过程中需要的对象。当tomcat启动的时候是如何初始化IOC容器...
  • 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对象对象,当然这是一个...
  • 回答一:实体类做为数据容器,在层间传递回答二:实体是用来存放信息的实体可以分为持久化对象(与数据库对应)和业务对象(包含业务信息对象)这两种对象之见是可以转换的. (我认为po/vo 对于SOA下的开发已经不是必须的...
  • 阿里面试真题:Spring容器启动流程

    万次阅读 多人点赞 2020-11-30 11:39:04
    org.springframework.context.annotation.AnnotatedBeanDefinitionReader#doRegisterBean 这个步骤主要是用来解析用户传入的 Spring 配置类,其实也是解析成一个 BeanDefinition 然后注册到容器中,没有什么好说的...
  • java容器(一)

    千次阅读 2011-09-15 20:01:16
    容器用来保存多个对象的东西.严格来说是保存对象的引用.因为对象实际的数据是放在另外的地方的....数组和其它容器的区别主要有三个:效率,类型,和存放基本类型的能力.JAVA中的数组是一种效率最高的存储和随机访问对象
  • 跟Java有关的容器

    千次阅读 热门讨论 2014-06-04 21:25:09
    一、什么是容器  通俗点容器就是用来盛放东西的。进入java的学习后,第一个要明白的就是java语言是一种完全...在JAVA中,“容器”的含义很贴近生活,JAVA容器是一个Java 所编写的程序,也是用来存放数据,对象的集合;
  • map提供一个键值对容器,在map(也叫关联数组)中我们提供一个键/值对,键用来索引,而值用作被存储和检索的数据. 在使用map和set时两个最主要的动作是向里面放入元素以及查询元素是否存在. 首先要包含头文件 #...
  • Spring和SpringMVC作为Bean管理容器和MVC层的默认框架,已被众多WEB应用采用,而实际使用时,由于有了强大的注解功能,很多基于XML的配置方式已经被替代,但是在实际项目中,同时配置Spring和Sprin
  • Java 容器与泛型

    千次阅读 2015-07-30 09:55:25
    JDK API中专门设计用来存储其他对象的类,一般称为对象容器类,简称容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework)。集合框架中容器类的关系如下图示: Set的三个常用实现...
  • 容器(二)

    万次阅读 多人点赞 2019-07-12 09:07:32
    Java 208 道面试题 · 容器   18. java 容器都有哪些? 常用容器的图录:   19. Collection 和 Collections 有什么区别? java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对...
  • 并发容器之ThreadLocal详解

    千次阅读 多人点赞 2019-10-11 19:12:30
    ThreadLocalMap是threadLocal一个静态内部类,和大多数容器一样内部维护了一个数组,同样的threadLocalMap内部维护了一个Entry类型的table数组。 /** * The table, resized as necessary. * table.length MUST ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 101,608
精华内容 40,643
关键字:

容器是用来存放什么类型对象