⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 0514102801.txt

📁 c++ builder 的一些txt文档
💻 TXT
字号:

化境编程界-
C++ 常用模板武道会(1)
 
 
  
  化境编程界首页| 化境软件库 | 化境教程库 | 其它资源 | 化境讨论区
| 化境留言板
 
 
  
  
   
showTop();
  
 
 
  欢迎访问《化境编程界》| * Email:5xsoft@21cn.com | < 留言板
 
  化境编程界 ->  技术文章 ->  C/C++/VC    
C++ 常用模板武道会(1)
 [ 作者: beyond_ml
  添加时间: 2001-7-5 14:12:30
 ]
 
   vector v.s. list v.s. deque
原创作者:beyond_ml
Ladies & Gentlemem:
大家好,这里是首届C++模板武道会的现场,本次武道会由beyond_ml做东,第一场解说员为beyond_ml。由于首次举办这样规模空前的盛会,难免有疏漏之处,还请各位高手不吝赐教。Beyond_ml有理啦。同时也欢迎各位大虾把此次武道会看做是一个虚基类,不断继承,派生出新的比赛。
比赛开始:
首先介绍比武参赛者:
Vector:金山词霸翻译成:矢量,向量等,C++容器模板中的大哥大,就像是一个加强版的队列,之所以这样说,是因为它不但有队列形式的索引,还能动态的添加扩充。使用尤其广泛,并且在许多经典教材中被作为重点介绍。
特点:把被包含的对象以数组的形式存储,支持索引形式的访问(这种访问速度奇快无比)。但由此也产生了一个问题,由于数据存储形式的固定化,你如果想在他中间部位insert对象的话,搞不好会让你吃尽苦头。因为他在分配空间的时候,可是成块分配的连续空间哦。
Deque:英文“double-ended-queue”。名如其人,这是C++有序容器中闻名遐迩的双向队列。他在设计之初,就为从两端添加和删除元素做了特殊的优化。同样也支持随即访问,也有类似于vector的[ ]操作符,但大家不要因此就把他和vector混为一潭哦。
特点:从本质上讲,他在分配内存的时候,使用了MAP的结构和方法。化整为零,分配了许多小的连续空间,因此,从deque两端添加、删除元素是十分方便的。最重要的一点:如果在不知道内存具体需求的时候,使用deque绝对是比vector好的,具体怎么好,比武为证。另外在插一句,不知是不是有意设计,大多数情况下,deque和vector是可以互换使用的。
List:模板中的双向链表。设计他的目的可能就是为了在容器中间插入、删除吧,所以有得比有失,他的随机访问速度可不敢恭维。而且没有[ ]操作。即便你是为了从前到后的顺序访问,也不见得就能快多少,“爱用不用,反正俺有强项!”List还挺哼,这也难怪,看看他的特点吧。
特点:随机的插入、删除元素,在速度上占有明显的优势。并且,由于内存分配不连续,他对插入的要求也十分的低。所以在使用大对象的时候,这可是一个不错的选择。
“闲言碎语不要讲,开打,开打。”
“咚……”
比武正式开始:
第一局:比一比谁的内存管理强。
比试方法:人为引起存储的对象数据溢出,分别看看系统消耗。系统消耗在这里指:对象构造函数、拷贝函数、析构函数的调用次数。
测试程序如下:
noisy.h …… 包含了测试对象,每次在调用构造、拷贝、析构函数的时候,都会打印相应的提示。
//: C04:Noisy.h
// A class to track various object activities
#ifndef NOISY_H
#define NOISY_H
#include <iostream>
class Noisy 
{
    static long create, assign, copycons, destroy;
    long id;
    public:
    Noisy() : id(create++) 
    {
       std::cout << "d[" << id << "]";
    }
    Noisy(const Noisy& rv) : id(rv.id) 
    {
       std::cout << "c[" << id << "]";
       copycons++;
    }
    Noisy& operator=(const Noisy& rv) 
    {
       std::cout << "(" << id << ")=[" <<
       rv.id << "]";
       id = rv.id;
       assign++;
       return *this;
    }
    friend bool
    operator<(const Noisy& lv, const Noisy& rv) 
    {
       return lv.id < rv.id;
    }
    friend bool
    operator==(const Noisy& lv, const Noisy& rv) 
    {
       return lv.id == rv.id;
    }
    ~Noisy() 
    {
       std::cout << "~[" << id << "]";
       destroy++;
    }
    friend std::ostream&
    operator<<(std::ostream& os, const Noisy& n) 
    {
       return os << n.id;
    }
    friend class NoisyReport;
};
 
struct NoisyGen 
{
    Noisy operator()() { return Noisy(); }
};
// A singleton. Will automatically report the
// statistics as the program terminates:
class NoisyReport 
{
    static NoisyReport nr;
    NoisyReport() {} // Private constructor
    public:
    ~NoisyReport() 
    {
       std::cout << "\n-------------------\n"
       << "Noisy creations: " << Noisy::create
       << "\nCopy-Constructions: "
       << Noisy::copycons
       << "\nAssignments: " << Noisy::assign
       << "\nDestructions: " << Noisy::destroy
       << std::endl;
    }
};
// Because of these this file can only be used
// in simple test situations. Move them to a
// .cpp file for more complex programs:
long Noisy::create = 0, Noisy::assign = 0,
Noisy::copycons = 0, Noisy::destroy = 0;
NoisyReport NoisyReport::nr;
#endif // NOISY_H ///:~
 
目标:插入一千个Noisy对象。
Vector上场 
//: C04:VectorOverflow.cpp
// Shows the copy-construction and destruction
// That occurs when a vector must reallocate
// (It maintains a linear array of elements)
#include "noisy.h"
#include <vector>
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main(int argc, char* argv[]) 
{
    int size = 1000;
   if(argc >= 2) size = atoi(argv[1]);
    vector<Noisy> vn;
    Noisy n;
   
   
  
   下一页 8
 相关内容:
 
- 概观C++程序设计语言
- C++学习要点
- C++实战之数据抽象
- UNIX环境下的日期程序
- 深析C++析构函数
 
showBottom();
申明: 本站
 所有内容均是从网上收集,若有侵范你版权的请指出,本站马上删除。
 © Copyright By 稻香老农 2000.3 - Now | 站务联系: 5xsoft@21cn.com | OICQ:593737 (只用于站务联系,不做它用)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -