一、对容器的基本认识

  总的来说,容器应该包含放在其中的对象的副本,而不是对象本身。

二、复制容器意味着什么?

  通常将容器成为模板,而容器内的对象的类型就是模板参数。Container<T>

  显然,如果复制容器只不过简单地使两个容器指向同一个底层对象,而不是复制容器内的元素,那么效率就会提高很多。毕竟,大多数复制是在调用函数时发生的,像下面这样编写代码会犯一个很常见的错误:

  void f(Container<T> );

 而用

  void f(const Constainer<T>& );

 就会好很多。

  复制容器意味着复制容器内的所有元素,这样做的开销是很大的。

三、如何获取容器内的元素

  从Container中取出对象时,应该得到类型T还是T&的对象呢?

  第一种观点:从上面所述我们知道,容器存放的是对象的副本,而不是对象本身。而存放对象副本只发生一次就可以了,然而,从容器中取出对象的操作常常有很多次,所以,避免获取容器中的对象时的复制操作所带来的额外开销,要比避免想容器中插入对象时的复制操作所带来的额外开销重要得多。取出来的应该是对象的引用

  第二种观点:上面关于效率的讨论也不是绝对的重要。如果取出来的是对象的引用,会导致一些问题。所以取出来的应该是对象的副本。

四、下面,根据以上分析设计一个容器:

  容器特点:

  1. 定长,长度为零或者大于零的整数;

  2. 操作符[]既可以读容器,也可以写容器;

  3. 存在从数组到指向它的第一个元素的指针的转换;

  4. 不允许容器的赋值和复制。

设计如下:

// Array_designer.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <iostream>
using namespace std; template<class T>
class Array
{
public:
Array(): data(), len()
{ } Array(unsigned size): len(size), data(new T[size])
{ } ~Array()
{
delete []data;
} const T& operator[] (unsigned n) const
{
if(n >= len || data == )
{
throw "Array subscript out of range";
}
return data[n];
} T& operator[] (unsigned n)
{
if(n >= len || data == )
{
throw "Array subscript out of range";
}
return data[n];
} operator const T*() const
{
return data;
} operator T*()
{
return data;
} private:
T *data;
unsigned len;
Array(const Array& a);//copy constructor
Array& operator=(const Array&); }; int _tmain(int argc, _TCHAR* argv[])
{
Array<int> a();// not Array<int> a[10];
int *start = a;
int *end = a + ;
int i = ; while(start != end)
{
*start++ = i++;
} start = a;
end = a + ; while(start != end)
{
cout<<*start++<<"\t";
}
cout<<a[(unsigned)];
system("pause");
return ;
}

  

C++沉思录之三——设计容器类的更多相关文章

  1. 【C++沉思录】句柄2

    1.[C++沉思录]句柄1 存在问题: 句柄为了绑定到Point的对象上,必须定义一个辅助类UPoint,如果要求句柄绑定到Point的子类上,那就存在问题了.2.有没有更简单的办法呢? 句柄使用Po ...

  2. 【C++沉思录】句柄1

    1.在[C++沉思录]代理类中,使用了代理类,存在问题: a.代理复制,每次创建一个副本,这个开销有可能很大 b.有些对象不能轻易创建副本,比如文件2.怎么解决这个问题? 使用引用计数句柄,对动态资源 ...

  3. 生活沉思录 via 哲理小故事(四)

    1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...

  4. 生活沉思录 via 哲理小故事

    本文转载:http://www.cnblogs.com/willick/p/3174803.html 1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛, ...

  5. 生活沉思录 via 哲理小故事(一)

    1.小托蒂的悲剧 意大利小男孩托蒂,有一只十分奇怪的眼睛,因为从生理上看,这是一只完全正常的眼睛,但却是失明的. 原来,托蒂刚出生时,这只眼睛轻度感染,曾用绷带缠了两个星期.这对常人来说几乎没有人任何 ...

  6. Atitit。 沉思录 与it软件开发管理中的总结 读后感

    Atitit. 沉思录 与it软件开发管理中的总结 读后感 1. <沉思录>,古罗马唯一一位哲学家皇帝马可·奥勒留所著 2 2. 沉思录与it软件开发管理中的总结 2 2.1. 要有自己的 ...

  7. c++学习书籍推荐《C++沉思录》下载

    百度云及其他网盘下载地址:点我 编辑推荐 经典C++图书,应广大读者的强烈要求再版 目录 第0章 序幕第一篇 动机第1章 为什么我用C++第2章 为什么用C++工作第3章 生活在现实世界中 第二篇 类 ...

  8. 【C++沉思录】代理类

    1.考虑下面的场景:设计一个容器,包含一组类型不同但相互关联的对象(比如:Animal,Dog,Cat),对象具备多态行为.2.容器一般只能包含一种类型的对象,使用vector<Animal&g ...

  9. C++沉思录之一

    一.系统跟踪类Trace的设计过程: step1:简单版 class Trace { public: Trace() { noisy = ; } void print(char* s) { if(no ...

随机推荐

  1. BIND9详解之日志篇

    在默认情况下,BIND把日志消息写到/var/log/messages文件中,而这些日志消息是非常少的,主要就是启动,关闭的日志记录和一些严重错误的消息,所以要详细记录服务器的运行状况,需要自己配置服 ...

  2. solr单机版的搭建

    一.solr单机版的搭建 1.运行环境 solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(ja),本教va写的Servlet容器程 ...

  3. iOS SearchBar为什么跳不出来第三方输入法

    去掉键盘类型就好了 // lineSearchBar.keyboardType = UIKeyboardTypeNamePhonePad;

  4. 使用shiro安全框架上传文件时用HttpSession获取ServletContext为null问题解决方法。

    <!--在shiroFilter 中加入一下配置--> <init-param> <param-name>targetFilterLifecycle</par ...

  5. POJ 3254 状压DP

    题目大意: 一个农民有一片n行m列 的农场   n和m 范围[1,12]  对于每一块土地 ,1代表可以种地,0代表不能种. 因为农夫要种草喂牛,牛吃草不能挨着,所以农夫种菜的每一块都不能有公共边. ...

  6. asp.net能不托管吗?

    弱弱地问一句,整个部署在IIS中的asp.net项目能不托管吗? 或者说有没有用纯粹的非托管语言(比方说C语言)写的非托管asp.net项目?

  7. MySQL查询执行的基础

    当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.一旦理解这一点,很多查询优化实际上就是遵循一些原则让优化器能够按照预想的合理的方式运行. 换句话说,是 ...

  8. 解决animate动画连续播放bug

    在animate动画中,如果几个div之间频繁切换,会导致鼠标移开后,动画仍在继续,解决方法有两个 一个,判断当前是否在运行动画: if(!$(".block").is(" ...

  9. cnetos6.4 x64 阿里云环境初探--安装pip,及pymysql

    由于以前帮朋友买过阿里云服务器,一直以为,不能再体验新用户免费了,由于最近比较有心情研究python,linux,就报着侥幸的心理,重新注册一个帐号试一下,注册完之后,惊奇的发现,原来阿里只要是新注册 ...

  10. 最简单的ASP动态页面生成伪静态方法

    目前网站制作中很多网站都采用生成静态页的方法,原因是这样访问速度会得到提高(服务器端CPU利用率很低),另外也容易被搜索引擎收录,但是这带来的一个问题就是需要足够大的空间存放这些静态页面,如果你的空间 ...