我必须在堆栈中创建一个迭代器,但在将一些值推入堆栈之前, 经过一段时间的努力,我想出了为什么下面的代码块会导致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;
}
有没有办法在初始化堆栈之前创建迭代器?
答案 0 :(得分:1)
无法将迭代器添加到堆栈中 - 这将违背堆栈的目的,您只能访问顶层元素。当你尝试
时auto iter = my_stack.top();
你没有获得迭代器,而是顶部的元素。在你的例子中,你尝试使用空堆栈,因此错误。
答案 1 :(得分:1)
Top不会返回迭代器,但是顶部元素,尽管堆栈为空,这会导致错误。 Stack不支持迭代器。它不是一个完全成熟的容器,而是一个容器适配器,它类似于底层容器的特殊typedef,默认为deque。
请注意,某些依赖于数据结构的操作可能会使现有迭代器无效。你打算用你的迭代器做什么?