类似栈的后进先出,但需要能用方括号[]遍历元素,可以用下标访问到元素。最终效果类似arr[0]是获取到当前数组最后一个元素的值,arr[1]获取到倒数第二个元素。如果用vector的insert方法插入到容器的第0个位置,好像可以,但这效率太低了,每次插入后得重排。所以想问下有没有更好的办法,谢谢先
1条回答 默认 最新
- 婉瑄|Vivian_ 2022-12-17 13:04关注
不论是用vector还是自定义数组,想要无限动态扩容,一定免不了heap allocation和大量数据的拷贝操作,效率极低;
我推荐使用链表来模拟栈;虽然链表没法random access,但通过重载[]运算符可以模拟这个效果。如果你需要代码我可以帮你实现一下(¯︶¯)
代码如下:(点个采纳吧,球球了!QAQ~)
#include <iostream> #include <list> template<typename T> class Stack { public: // default ctor Stack() = default; // push element into the stack void push(const T& __ele) noexcept { this->m_stack.push_back(__ele); } // pop element out the stack void pop() noexcept { this->m_stack.pop_back(); } // get the top element T& top() noexcept { return *this->m_stack.rbegin(); } // check if the stack is empty bool is_empty() const noexcept { return this->m_stack.empty(); } // get the size of stack unsigned int size() const noexcept { return this->m_stack.size(); } // overload operator[] to random access T& operator[] (const unsigned int idx) try { if(idx >= this->size()) throw std::domain_error("Index out of range! \n"); auto iter = this->m_stack.begin(); for(int i = 0; i < idx; i++, iter++); return *iter; } catch(const std::domain_error& e) { std::cout << e.what() << '\n'; throw; } private: std::list<T> m_stack; }; #define TEST #ifdef TEST int main() { Stack<int> stack; for (int i = 0; i < 10; i++) stack.push(i); // access top std::cout << stack.top() << '\n'; // pop top stack.pop(); // access top std::cout << stack.top() << '\n'; // access with [] std::cout << stack[0] << '\n'; // assign with [] stack[0] = 11; std::cout << stack[0] << '\n'; // iter with [] for(int i = 0; i < stack.size(); i++) std::cout << stack[i] << ' '; } #endif
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 什么设备可以研究OFDM的60GHz毫米波信道模型
- ¥15 不知道是该怎么引用多个函数片段
- ¥15 爬取1-112页所有帖子的标题但是12页后要登录后才能 我使用selenium模拟登录 账号密码输入后 会报错 不知道怎么弄了
- ¥30 关于用python写支付宝扫码付异步通知收不到的问题
- ¥50 vue组件中无法正确接收并处理axios请求
- ¥15 隐藏系统界面pdf的打印、下载按钮
- ¥15 基于pso参数优化的LightGBM分类模型
- ¥15 安装Paddleocr时报错无法解决
- ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
- ¥50 分布式追踪trace异常问题