提问人:oronr 提问时间:11/16/2023 更新时间:11/16/2023 访问量:46
不明白 std::iterator 在列表初始化中是如何工作的 [duplicate]
Don't understand how std::iterator works in list initialization [duplicate]
问:
我在使用 . 时遇到问题。首先,我定义了一个:std::vector::iterator
struct
template <typename T>
struct VecIter {
VecIter(std::vector<T>::iterator &&it_, size_t remain_):
it(it_), remain(remain_) {}
std::vector<T>::iterator ⁢
size_t remain;
T& operator * () {
return *it;
}
};
它只是一个常规迭代器的包装器。下面是一个测试类:
template <typename T>
class testA {
public:
testA(std::vector<T> &a) {
stack.push_back({a.begin(), a.size()});
}
std::vector<VecIter<T>> stack;
};
构造函数将 a 作为输入并初始化我们的迭代器包装器。测试部分如下:std::vector
TEST(TestIterator, test_iter_in_stack) {
std::vector<int> a{3, 2, 1};
testA<int> sol(a);
auto x = sol.stack[0];
auto it = x.it; // extract the iterator
cout << *it << "\n"; // segmentation fault here...
it++;
cout << *it << "\n";
}
我的问题是为什么这里会导致分段错误?我怀疑列表初始化没有成功传递迭代器。*it
stack.push_back({a.begin(), a.size()})
我希望测试应该打印出来并且.欢迎任何评论。谢谢!3
2
答:
1赞
Alan Birtles
11/16/2023
#1
VecIter::it
是对 返回的临时对象的悬空引用。应更改为 .a.begin()
std::vector<T>::iterator &it
std::vector<T>::iterator it
一般来说,迭代器可能只不过是一个指针,通过引用传递和存储它们不太可能是必要的。标准库通常按值传递它们,例如在 std::vector
构造函数中。
下一个:迭代器的迷雾
评论
std::vector::iterator
std::iterator