在初始化之前使用<stack>和iterator with auto导致seg fault </stack>

时间:2014-07-30 10:59:40

标签: c++ stack

我必须在堆栈中创建一个迭代器,但在将一些值推入堆栈之前, 经过一段时间的努力,我想出了为什么下面的代码块会导致seg错误

#include <map>
#include <set>
#include <stack>
#include <utility>
#include <algorithm>

typedef std::stack<std::pair<short, std::set<short>>> stack_t;

int main()
{
    std::set<short> x = {0, 1, 2, 3};

    stack_t my_stack;
    auto iter = my_stack.top(); // error (segmentation fault)

    my_stack.push(std::make_pair(3, x));
    iter = my_stack.top();
    //...

    return 0;
}

有没有办法在初始化堆栈之前创建迭代器?

2 个答案:

答案 0 :(得分:1)

无法将迭代器添加到堆栈中 - 这将违背堆栈的目的,您只能访问顶层元素。当你尝试

auto iter = my_stack.top();

你没有获得迭代器,而是顶部的元素。在你的例子中,你尝试使用空堆栈,因此错误。

答案 1 :(得分:1)

Top不会返回迭代器,但是顶部元素,尽管堆栈为空,这会导致错误。 Stack不支持迭代器。它不是一个完全成熟的容器,而是一个容器适配器,它类似于底层容器的特殊typedef,默认为deque。

请注意,某些依赖于数据结构的操作可能会使现有迭代器无效。你打算用你的迭代器做什么?