自定义容器

自定义容器(动态数组——队列)
作用:可以保存任意数量、任意数据类型的数据
下面用java语言实现容器的四大基本操作:增、删、查、改

1.增


package com.ywl;

public class Mylist
{
      //初始化原始数组长度为零
	int[] srcArray = new int[0];
	/*
	 * 向容器内添加元素(element)
	 */
	public void add(int element)
	{
		//创建新数组对象长度比原来的大一
		int[] newArray =new int[srcArray.length+1];
		//把原来数组的元素拷贝到新数组的相应位置
		for(int i=0;i<srcArray.length;i++){
			newArray[i]=srcArray[i];
		}
		//在新数组末端添加元素 element
		newArray[srcArray.length]=element;
		//把新数组赋值给原数组
		srcArray=newArray;
	}
	/*
	 * 获取中容器的长度
	 * 返回 长度
	 */
	public int getLength()
	{
		return srcArray.length;
	}
	/*
	 * 显示数组中的所有元数
	 */
	public void showAllelement()
	{
		System.out.println("数组中的元素为:");
		for(int i=0;i<srcArray.length;i++){
			System.out.println(srcArray[i]);
		}
	}
	/*
	 * 主函数
	 */
	public static void main(String[]arg)
	{
		//创建对象
		Mylist list = new Mylist();
		list.add(2);
		list.add(0);
		list.add(3);
		list.showAllelement();
	}
}

结果为:

数组中的元素为:
2
0
3

2.删

package com.ywl;
public class Mylist
{
	//初始化原始数组长度为零
	int[] srcArray = new int[0];
	/*
	 *向容器末尾添加指定的元素
	 * element要添加的元素
	 */
	public void add(int element){
		//创建新数组对象 长度比scrArray大一
		int[] newArray = new int[srcArray.length+1];
		//将原始数组中的元素拷贝到新数组的对应位置
		for(  int i=0;i<srcArray.length;i++){
			newArray[i]=srcArray[i];
		}
		//将element添加到newArray末尾
		newArray[srcArray.length]=element;
		//将newArray赋值给srcArray
		srcArray=newArray;
	}
	/*
	 * 删除容器的指定元素
	 */
	public void remove(int index)
	{   int i=index;
		//创建新数组对象长度比原来的小一
		int[] newArray =new int[srcArray.length-1];
		//把原来数组i之前的元素拷贝到新数组的相应位置
		for(int j=0;j<i;j++){
			newArray[j]=srcArray[j];
		}
		//把原数组i之后的元素拷贝的到数组的相应位置
		for(int j=i;j<srcArray.length-1;j++){
			newArray[j]=srcArray[j+1];
		}
		//把新数组赋值给原数组
		srcArray=newArray;
	}
	/*
	 * 获取中容器的长度
	 * 返回 长度
	 */
	public int getLength()
	{
		return srcArray.length;
	}
	/*
	 * 显示数组中的所有元数
	 */
	public void showAllelement()
	{
		System.out.println("数组中的元素为:");
		for(int i=0;i<srcArray.length;i++){
			System.out.println(srcArray[i]);
		}
	}
	/*
	 * 主函数
	 */
	public static void main(String[]arg)
	{
		//创建对象
		Mylist list = new Mylist();
		list.add(2);
		list.add(0);
		list.add(5);
		list.showAllelement();
		list.remove(2);
		list.showAllelement();
	}
}
结果为:

数组中的元素为:
2
0
5
数组中的元素为:
2
0

3查

package com.ywl;
public class Mylist
{
	//初始化原始数组长度为零
	int[] srcArray = new int[0];
	/*
	 *向容器末尾添加指定的元素
	 * element要添加的元素
	 */
	public void add(int element){
		//创建新数组对象 长度比scrArray大一
		int[] newArray = new int[srcArray.length+1];
		//将原始数组中的元素拷贝到新数组的对应位置
		for(  int i=0;i<srcArray.length;i++){
			newArray[i]=srcArray[i];
		}
		//将element添加到newArray末尾
		newArray[srcArray.length]=element;
		//将newArray赋值给srcArray
		srcArray=newArray;
	}
	/*
	 * 查找容器的指定位置的元素
	 */
	public int getlength(int index){
		return srcArray[index];
	}
	
	/*
	 * 获取中容器的长度
	 * 返回 长度
	 */
	public int getLength()
	{
		return srcArray.length;
	}
	/*
	 * 显示数组中的所有元数
	 */
	public void showAllelement()
	{
		System.out.println("数组中的元素为:");
		for(int i=0;i<srcArray.length;i++){
			System.out.println(srcArray[i]);
		}
	}
	/*
	 * 主函数
	 */
	public static void main(String[]arg)
	{
		//创建对象
		Mylist list = new Mylist();
		list.add(2);
		list.add(0);
		list.add(5);
		list.showAllelement();
		System.out.println("查找的元素为:"+list.getlength(1));
		
		
	}
		
}
结果为:

数组中的元素为:
2
0
5
查找的元素为:0
4.改

package com.ywl;
public class Mylist
{
	//初始化原始数组长度为零
	int[] srcArray = new int[0];
	/*
	 *向容器末尾添加指定的元素
	 * element要添加的元素
	 */
	public void add(int element){
		//创建新数组对象 长度比scrArray大一
		int[] newArray = new int[srcArray.length+1];
		//将原始数组中的元素拷贝到新数组的对应位置
		for(  int i=0;i<srcArray.length;i++){
			newArray[i]=srcArray[i];
		}
		//将element添加到newArray末尾
		newArray[srcArray.length]=element;
		//将newArray赋值给srcArray
		srcArray=newArray;
	}
	/*
	 * 修改容器指定位置的元素
	 */
	public int set(int index,int element)
	{
		//需要修改的数
		srcArray[index]=element;
		return element;
	}
	
	/*
	 * 获取中容器的长度
	 * 返回 长度
	 */
	public int getLength()
	{
		return srcArray.length;
	}
	/*
	 * 显示数组中的所有元数
	 */
	public void showAllelement()
	{
		System.out.println("数组中的元素为:");
		for(int i=0;i<srcArray.length;i++){
			System.out.println(srcArray[i]);
		}
	}
	/*
	 * 主函数
	 */
	public static void main(String[]arg)
	{
		//创建对象
		Mylist list = new Mylist();
		list.add(2);
		list.add(0);
		list.add(5);
		list.showAllelement();
	    list.set(0,4);//修改数组下标为0的元素
	    list.showAllelement();//修改之后的数组
		
		
	}
		
}
结果为:

数组中的元素为:
2
0
5
数组中的元素为:
4
0
5






### C++ 自定义容器的实现方法 #### 1. 容器基本概念 在C++中,标准库提供了多种内置容器(如`std::vector`, `std::list`, `std::map`),这些容器封装了动态数组、链表其他数据结构的功能。然而,在某些情况下,可能需要自定义容器来满足特定需求,比如优化性能或管理资源。 #### 2. 实现自定义容器的核心要素 构建一个自定义容器通常涉及以下几个方面: - 数据存储方式的选择。 - 提供迭代器支持以便于遍历。 - 支持常见的操作接口,例如插入、删除访问元素等。 #### 3. 示例:简单向量类 (Vector) 下面展示了一个简单的自定义向量容器的例子: ```cpp #include <iostream> #include <stdexcept> class SimpleVector { private: int* data; // 动态数组指针 size_t capacity; // 当前容量 size_t size_; // 当前大小 public: // 构造函数 SimpleVector() : data(nullptr), capacity(0), size_(0) {} ~SimpleVector() { delete[] data; } void push_back(int value) { if (size_ >= capacity) { resize(); } data[size_] = value; ++size_; } int& operator[](size_t index) const { if (index >= size_) throw std::out_of_range("Index out of range"); return data[index]; } size_t size() const { return size_; } bool empty() const { return size_ == 0; } private: void resize() { capacity = (capacity == 0) ? 8 : capacity * 2; int* newData = new int[capacity]; for (size_t i = 0; i < size_; ++i) { newData[i] = data[i]; } delete[] data; data = newData; } }; int main() { SimpleVector vec; vec.push_back(1); vec.push_back(2); for (size_t i = 0; i < vec.size(); ++i) { std::cout << vec[i] << &#39; &#39;; } return 0; } ``` 上述代码展示了如何创建一个简易版本的向量容器[^1]。它实现了动态扩容机制,并提供了一些基础功能,如添加元素 (`push_back`) 通过索引访问元素 (`operator[]`)。 #### 4. 迭代器的支持 为了使自定义容器更加灵活并兼容STL算法,可以为其添加迭代器支持。以下是扩展上面例子以加入迭代器的一个片段: ```cpp class SimpleVectorIterator { protected: int* ptr; public: using iterator_category = std::random_access_iterator_tag; using difference_type = std::ptrdiff_t; using value_type = int; using pointer = int*; using reference = int&; explicit SimpleVectorIterator(int* p) noexcept : ptr(p) {} reference operator*() const noexcept { return *ptr; } pointer operator->() const noexcept { return ptr; } // 前置++ SimpleVectorIterator& operator++() noexcept { ++ptr; return *this; } // 后置++ SimpleVectorIterator operator++(int) noexcept { auto old = *this; ++(*this); return old; } friend bool operator==(const SimpleVectorIterator& a, const SimpleVectorIterator& b) noexcept { return a.ptr == b.ptr; } friend bool operator!=(const SimpleVectorIterator& a, const SimpleVectorIterator& b) noexcept { return !(a == b); } }; ``` 此部增加了对随机访问迭代器的支持,使得该容器能够被更广泛的标准模板库(STL)算法所利用。 #### 5. 总结 以上介绍了关于如何设计与实现自己的C++容器的一些基础知识技术细节。实际开发过程中还需要考虑更多因素,例如异常安全性、线程同步等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值