zoukankan      html  css  js  c++  java
  • 模版——容器,迭代器

    题:

    试用多态实现线性表(队列、串、堆栈),要求具备线性表的基本操作:插入、删除、测长等。【美国著名软件企业GS公司2007年11月面试题】

    解析:

    队列、串、堆栈都可以实现push、pop、测长等操作。现在要求用多态去实现,就要建立一个线性表的共性模版,来实现以上的功能。

    答案:程序源代码与解释如下

    // P101_example2.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    
    template <typename T>
    struct tcontainer
    {
    	virtual void push(const T&) = 0;	//插入
    	virtual void pop() = 0;	//删除
    	virtual const T& begin() = 0;	//
    	virtual const T& end() = 0;	//
    	virtual size_t size() = 0;	//返回长度
    };
    
    template <typename T>
    struct tvector : public tcontainer<T>
    {
    	static const size_t _step = 100;	//一次增加容量的大小
    private:
    	size_t _size;	//实际元素的个数
    	size_t _cap;	//已分配的容量
    	T* buf;	//首地址
    public:
    	tvector()
    	{
    		_size = 0;	//初始化容器实际大小
    		_cap = _step;	//初始化容器容量的大小为_step
    		buf = 0;	//首地址需要动态分配内存
    		re_capacity(_cap);	//此时buf为空,即要设置buf初始值,配了100个元素的空间
    	}
    	~tvector()
    	{
    		free(buf);	//释放内存
    	}
    	void re_capacity(size_t s)	//调整容量
    	{
    		if(!buf)	//buf初始为空
    		{
    			buf = (T*)malloc(sizeof(T)*s);
    		}
    		else
    			buf = (T*)realloc(buf,sizeof(T)*s);	//在buf基础上调整容量
    	}
    	virtual void push(const T& v)
    	{
    		if(_size >= _cap)	//超过容量
    			re_capacity(_cap += _step);
    		buf[_size++] = v;
    	}
    	virtual void pop()	//删除最后一个元素
    	{
    		if(_size)
    			_size--;
    	}
    	virtual const T& begin()	//返回第一个元素
    	{
    		return buf[0];
    	}
    	virtual const T& end()	//返回最后一个元素
    	{
    		if(_size)
    			return buf[_size-1];
    	}
    	virtual size_t size()	//返回容量的大小
    	{
    		return _size;
    	}
    	const T& operator[](size_t i)	//取第i个元素
    	{
    		if(i >= 0 && i < _size)
    			return buf[i];
    	}
    };
    int _tmain(int argc, _TCHAR* argv[])
    {
    	tvector<int> v;
    	for(int i = 0; i < 1000; ++i)
    	{
    		v.push(i);
    	}
    	for(int i = 0; i < 1000; ++i)
    	{
    		std::cout<<v[i]<<std::endl;
    	}
    	return 0;
    }
    


  • 相关阅读:
    字符串匹配常见算法(BF,RK,KMP,BM,Sunday)
    JSP基本语法总结【1】(jsp工作原理,脚本元素,指令元素,动作元素)
    JUnit【1】断言用法之assertEquals/True/False/ArrayEquals
    软件测试基础配置
    前端入门20-JavaScript进阶之异步回调的执行时机
    前端入门19-JavaScript进阶之闭包
    前端入门18-JavaScript进阶之作用域链
    前端入门17-JavaScript进阶之作用域
    前端入门16-JavaScript进阶之EC和VO
    前端入门15-JavaScript进阶之原型链
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3172339.html
Copyright © 2011-2022 走看看