assembly 是否有一种方法可以引用/索引/指针std::stack中的项?

yhived7q  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(104)

正如标题所说,使用std::stack是否有一种方法可以通过引用/索引/指针来引用任何项而不弹出?如果没有,我如何实现这一点?
我的用例是,我正在做一个用于学习的虚拟机,我想引用std::stack中的堆栈项,这样我就可以推送和访问我的本地堆栈变量。我原本只打算做一个堆栈实现--但是我有stl!我猜我可能不得不自己滚动,因为这些项是不可变的,而且我还没有看到任何说明它的文档:(
我的用例(asm ; C++语言)

mov DWORD PTR [rbp-4], 123  ; stack.push(123);
mov DWORD PTR [rbp-8], 321  ; stack.push(321);
add DWORD PTR [rbp-4], 1    ; stack[?] = stack[?] + 1;
kkbh8khc

kkbh8khc1#

是的,有一种简单的方法可以通过底层容器访问数据。
通常,所有这些都是不必要的,因为您始终可以首先使用基础容器。
但是如果你想在特殊情况下这样做,那么只需要取top()的地址,这将是底层容器中的最后一个元素,如果你减去堆栈的size()(修正为1),那么你就有了一个指向底层容器开头的指针。
然后,您可以按预期使用下标运算符[]
请参见以下示例:

#include <vector>
#include <stack>
#include <iostream>
#include <algorithm>
#include <iterator>

using Number = int;
using UnderlyingContainer = std::vector<Number>;
using Stack = std::stack< Number, UnderlyingContainer>;

using StackIterator = Number *const;

int main()
{
    // Put the test data onto the stack
    Stack myStack{ UnderlyingContainer {1,2,3,4,5} };

    if (not myStack.empty()) {

        // Get "iterators"
        StackIterator end = &myStack.top() + 1;
        StackIterator begin = end - myStack.size();

        Number *const & stk = begin;

        for (size_t i{}; i < myStack.size(); ++i)
            stk[i] = stk[i] + 10;

        for (size_t i{}; i < myStack.size(); ++i)
            std::cout << stk[i] << '\n';

        std::transform(begin, end, begin, [](const Number n) {return n - 10; });
        std::copy(begin, end, std::ostream_iterator<Number>(std::cout, "\n"));
    }
}

因此,看起来我们找到了您想要的内容,但实际上,我们只是在底层容器上工作。
但正如前面所说,有时候这样做是有原因的......

相关问题