按值传递容器会使迭代器失效吗? [英] Does passing containers by value invalidate iterators?

查看:134
本文介绍了按值传递容器会使迭代器失效吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是一些示例代码:

#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);
}

On ideone 输出为:

1 2 3 
163487776 2 3 

问题

如果我将 f(T t)更改为 f(T& t),则输出符合预期。我假设因为我正在使用容器的副本,从技术上讲,我在向量上推回的迭代器与我在main中创建的向量不同。它是否正确?
我注意到的一件事是 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 有效 > f ,并且在 f 结束时, 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.

这篇关于按值传递容器会使迭代器失效吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆