003.Stack(利用向量实现)

分享了在学习清华大学邓俊辉教授数据结构课程过程中的心得,特别介绍了使用向量类派生出Stack模板类的方法,实现了栈的基本操作,如push、pop和top,并通过示例代码展示了其应用。

自己最近在学习清华大学邓俊辉教授的数据结构课程,不得不赞叹,邓老师出色的授课技巧,以及前人业已设计好的一系列算法和设计模式,使得我们解决问题的时候如鱼得水。在这里,我将数据结构Stack的实现过程贴出来,并在下面附上在编写代码的过程中遇到的问题。

#pragma once
#include"Vector.h"//以向量类,派生出模板类


template <typename T> 
class Stack : public Vector<T> 
{	//将向量的首/末端作为栈底/顶
	public: 
		//size()、empty()以及其它开放接口,均可直接沿用
		void push(T const& e)
		{ 
			//值得注意的是:由于insert接口业已在标准库中有其自己的实现,所以这里要显示的指明
			//所调用的是那一个重载版本
			Vector<T>::insert(e);
		} //入栈:等效于将新元素作为向量的末元素插入

		T pop() 
		{
			return Vector<T>::remove(Vector<T>::size() - 1);
		} //出栈:等效于删除向量的末元素

		T& top() 
		{ 
			return (*this)[Vector<T>::size() - 1];
		} //取顶:直接返回向量的末元素
};


int main()
{
	int i;
	Stack<int>stk;
	for (i = 0; i < 10; i++)
	{
		//进行100次入栈操作
		stk.push(i);
	}
	cout << "-------------------01.取顶操作--------------------------------------------" << endl;
	int top = stk.top();
	cout << "the current top element of this stack is:" << top << endl;
	cout << endl;

	cout << "-------------------02.不断地弹栈,直到栈为空,并输出栈中的内容-------------" << endl;
	while (!stk.empty())
	{
		cout << stk.top() << " ";
		stk.pop();
	}
	cout << endl;
	cout << endl << "test over!" << endl;

	system("pause");
	return 0;
}

我们需要学会善于利用面向对象等特点,避免重复的造轮子,因而这个版本的Stack模板类是基于此前业已实现并加以严密测试的Vector类进一步改造的,实际上对于一个栈结构的实现,即可以基于所谓的顺序存储结构(也就是这里所贴出的实现方式),又可以基于链表实现,另一种实现方式将在下一篇文章中给出。

在这段代码中有一个值得注意的点,那就是在调用父类的函数的时候最好显式的写明出来调用的是哪一个父类的函数,因为一个函数可能被多个父类甚至是库函数各自实现。比如下面的写法虽然麻烦,但是语义确是明确的:

1.Vector::insert(e);
2.Vector::remove(Vector::size() - 1);
3.(this)[Vector::size() - 1];

### PyTorch `torch.stack` 函数的作用及用法 #### 1. **`torch.stack` 的作用** `torch.stack` 是 PyTorch 中用于将多个张量沿指定的新维度堆叠起来的函数。它的主要特点是会在给定的维度上创建一个新的轴,从而改变张量的整体形状[^1]。 例如,在机器学习模型中,当需要将一批数据按特定方式组合时,可以利用 `torch.stack` 来实现这一目标。通过该方法,能够方便地管理不同批次的数据或者特征向量集合。 --- #### 2. **基本语法** ```python torch.stack(tensors, dim=0, *, out=None) -> Tensor ``` - 参数说明: - `tensors`: 需要堆叠的张量列表,其中每个张量必须具有相同的形状。 - `dim`: 新增维度的位置索引,默认值为 `0` 表示新增加的维度位于最前面。 - `out`: 可选参数,用于存储结果的输出张量位置。 返回的结果是一个新的张量,其形状由原张量组新增维度共同决定。 --- #### 3. **具体实例分析** ##### 实例 1: 基本使用 (`dim=0`) 假设我们有两个相同大小的一维张量 `[1, 2, 3]` `[11, 22, 33]`,希望将其在第 `0` 维度上堆叠: ```python import torch a = torch.tensor([1, 2, 3]) b = torch.tensor([11, 22, 33]) c = torch.stack([a, b], dim=0) print(c.size()) # 输出: torch.Size([2, 3]) print(c) # 输出: # tensor([[ 1, 2, 3], # [11, 22, 33]]) ``` 这里,两个原始张量被重新排列到一个二维矩阵中,新加的维度成为第一个维度[^2]。 --- ##### 实例 2: 更改堆叠方向 (`dim=1`) 如果我们将上面的例子改为在第二维度(即列的方向)进行堆叠,则代码如下所示: ```python d = torch.stack([a, b], dim=1) print(d.size()) # 输出: torch.Size([3, 2]) print(d) # 输出: # tensor([[ 1, 11], # [ 2, 22], # [ 3, 33]]) ``` 此时,每一行分别对应于来自输张量中的元素对齐后的结果[^4]。 --- ##### 实例 3: 错误情况处理 尝试设置超出当前张量支持范围的最大维度数将会引发异常。比如对于三维张量而言,合法的 `dim` 范围应介于 `-4` 到 `3` 之间;若设定非法数值如 `4` ,则会产生下述错误提示信息: ```plaintext IndexError: Dimension out of range (expected to be in range of [-4, 3], but got 4) ``` 这表明所选定的操作维度超出了允许界限[^3]。 --- #### 4. **注意事项** -的所有张量需具备一致的尺寸结构; - 如果指定了负数作为 `dim` 参数,则是从最后向前计数的有效位次; - 结果张量总是包含比任意单一源张量更多的维度数目。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值