按值传递容器是否会使迭代器无效?
下面是一些示例代码:
#include <iostream>
#include <vector>
template <typename T>
std::vector<typename T::iterator> f(T t)
{
std::vector<typename T::iterator> v;
for (auto i = t.begin(); i != t.end(); ++i)
{
v.push_back(i);
}
return v;
}
template <typename T>
void print(const std::vector<T>& v)
{
for (auto i = v.begin(); i != v.end(); ++i)
{
std::cout << **i << ' ';
}
std::cout << std::endl;
}
int main()
{
std::vector<int> v{1, 2, 3};
print(f(v));
std::vector<std::vector<int>::iterator> itervec = f(v);
print(itervec);
}
在 ideone 上的输出是:
1 2 3
163487776 2 3
问题
如果我将 f(T t)
更改为 f(T& t)
,则输出符合预期.我假设因为我正在使用容器的副本,从技术上讲,我在向量上推回的迭代器与我在 main.js 中创建的向量不同.这个对吗?我注意到的一件事是 print(f(v));
按预期打印 1 2 3
但是一旦我将它分配给 itervec
第一个迭代器变成垃圾,这一切都依赖于实现吗?
If I change f(T t)
to f(T& t)
the output is as expected. I'm assuming because I am working with copies of containers, technically the iterators I am pushing back on the vector are not the same as the vector I created in main. Is this correct?
The one thing I noticed is print(f(v));
prints 1 2 3
as expected but as soon as I assign it to itervec
the first iterator becomes garbage, is this all implementation dependent?
推荐答案
是的,迭代器是迭代器只对函数中的本地对象
,而在v
有效ff
结束时,v
超出范围被销毁,迭代器无效.
Yes, the iterators are iterators only valid for the local object v
in the function f
, and at the end of f
, v
goes out of scope and is destroyed, and the iterators are invalid.
您必须通过引用(或指针或其他方式)传递向量,以便您存储的迭代器是调用者传入的原始对象的迭代器,而不是存储在局部变量中的临时副本.
You have to pass the vector by reference (or pointer or whatever) so that the iterators you store are the iterators for the original object that the caller passes in, not for a temporary copy stored in a local variable.
您看到的行为是未定义的,所以它恰好正确地打印了前三个和后两个.
The behaviour you are seeing is undefined, so it just happens to print the first three and last two correctly.
相关文章