一、对容器的基本认识

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

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

  通常将容器成为模板,而容器内的对象的类型就是模板参数。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. shell 中 2>&1 的使用

    一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |). 2)默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes ` ...

  2. php遍历数据库

    数据库 <?php mysql_connect("localhost","root",""); mysql_set_charset(& ...

  3. 高放的c++学习笔记之重载运算与类型转换

    ▲基本概念 (1)重载运算符是具有特殊名字的函数,它们的名字又operator和其后要定义的运算符号共同构成.. (2)对于一个运算符号来说它或者是类的成员,或者至少含有一个类类型的参数. (3)我们 ...

  4. jquery判断页面滚动条(scroll)是上滚还是下滚

    单纯判断滚动条方向 function scroll( fn ) { var beforeScrollTop = document.body.scrollTop, fn = fn || function ...

  5. jQuery制作go to top按钮

    转自:http://www.w3cplus.com/jquery/scrolling-to-the-top-with-jquery 每每看到网友Blog的页面底部或中间有一个按钮回到页面顶部,羡慕死人 ...

  6. PHP高效的敏感词过滤方法

    <?php // 测试文件demo.php $badword = array( '张三','张三丰','张三丰田' ); // array_combine() 函数通过合并两个数组来创建一个新数 ...

  7. day03

    1.set集合--无序的,不重复的序列,类似dict,但是只有key,没有value 创建一个集合: s1 = {11,22,33} s2 = set((22,33,44))必须传入一个可迭代对象(t ...

  8. Python操作excel(xlrd和xlwt)

    Python操作excel表格有很多支持的库,例如:xlrd.xlwt.openpyxl.win32com,下面介绍使用xlrd.xlwt和xlutils模块这三个库不需要其他的支持,在任何操作系统上 ...

  9. 下拉列表框Combo Box

    Combo Box/Combo Box Ex 组合窗口是由一个输入框和一个列表框组成.创建一个组合窗口可以使用成员函数: BOOL CListBox::Create( LPCTSTR lpszText ...

  10. 关于DDOS攻击中TCP半连接数与FD的关系

    TCP最大连接数 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接.那么对单机,其最大并发tcp连接数是多少? 理论最大值 在确定最大连接数之 ...