【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3656|回复: 0

[STL] 手把手教你stl之list

[复制链接]
发表于 2009-3-1 01:53:25 | 显示全部楼层 |阅读模式
list 是个队列,它提供删除插入排序合并等方法,同时也可用迭代器进行查看.与向量(vector)相比, 它允许快速的插入和删除,但是随机访问却比较慢.
      它提供的的方法如下, 本文不一一指出,仅指出几个注意点.
            assign() 给list赋值
            back() 返回最后一个元素
            begin() 返回指向第一个元素的迭代器
            clear() 删除所有元素
            empty() 如果list是空的则返回true
            end() 返回末尾的迭代器
            erase() 删除一个元素
            front() 返回第一个元素
            get_allocator() 返回list的配置器
            insert() 插入一个元素到list中
            max_size() 返回list能容纳的最大元素数量
            merge() 合并两个list
            pop_back() 删除最后一个元素
            pop_front() 删除第一个元素
            push_back() 在list的末尾添加一个元素
            push_front() 在list的头部添加一个元素
            rbegin() 返回指向第一个元素的逆向迭代器
            remove() 从list删除元素
            remove_if() 按指定条件删除元素
            rend() 指向list末尾的逆向迭代器
            resize() 改变list的大小
            reverse() 把list的元素倒转
            size() 返回list中的元素个数
            sort() 给list排序
            splice() 合并两个list
            swap() 交换两个list
            unique() 删除list中重复的元素

       1. 在使用STL list的过程中, 如果该类型包括指针成员变量, 那么list用起来非常麻烦.因为将一个成员变量push到list时执行的操作是将当前变量拷贝一份到list中.而将成员变量从list中移出时,变量的释放由list完成.因此,(1)变量所代表的类不能有析构方法;(2)变量中的指针指申请的资源释放成问题;

       比如:

       class CExample
       {
       public:
               CExample()
               {
                       m_pExample = new char[1024*1024*1024];
               }

       private:
               long  m_lExample;
               char *m_pExample;
       };

       typedef std::list<CExample> ExampleList;

       (1) CExample不能有自己的析构方法,否则使用ExampleList时会出错;

       (2) m_pExample是在堆上分配出来的,当CExample的对象从ExampleList的对象中删除时,m_pExample所指向的空间不会被自动释放; 当需要的空间较大时只能用从堆上分配,而不能在stack上分配。
    

       2. 对指定类型进行排序

       #include <list>
       #include <iostream>

       using namespace std;

       class sot
       {
        public:
              sot(int i):m_iN(i)
              {

              }
              int m_iN;
         };

       struct sssgs
       {
              bool operator()(const sot* &s1,const sot* &s2)
              {
                     if(s1->m_iN < s2->m_iN) return true;
                            return false;
              }
       };

       bool operator<(const sot& s1,const sot& s2)
       {
              if(s1.m_iN > s2.m_iN) return true;
                     return false;
       }

       ostream& operator<<(ostream &o2,sot& s)
       {
              o2<<s.m_iN<<endl;
              return o2;
       }

       int main()
       {
              list<sot> listSot;
              list<sot>::iterator itrSot;
              for(int i = 0;i < 20;i++)listSot.push_back(sot(i));
              sssgs sg;

              // 排序
              listSot.sort();

              for(itrSot = listSot.begin();itrSot != listSot.end();itrSot++)
                     cout<<*itrSot;
              
              return 0;
       }

       3. 迭代期间的删除
       std::list<int> m_list;
       std::iist<int>::iterator m_listiter;
       for (m_listiter = m_list.begin(); m_listiter != m_list.end(); m_listiter++)
             m_listiter = m_list.erase(m_listiter);
    
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-5-22 05:51

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表