当前位置: 首页 > 知识库问答 >
问题:

按值传递容器会使迭代器无效吗?

简成仁
2023-03-14

下面是一些示例代码:

#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


共有2个答案

靳涵亮
2023-03-14

是的,因为您正在接收一个临时并返回该临时的迭代器。函数退出后,临时会被清理,使迭代器无效。

但是,如果您通过了引用,则main和print都在访问同一对象。由于此对象在函数退出后仍然存在,因此迭代器不会失效。

慕凌龙
2023-03-14

是的,迭代器是迭代器,仅对函数f中的本地对象v有效,在f的末尾,v超出范围并被销毁,迭代器无效。

必须通过引用(或指针或其他方式)传递向量,以便存储的迭代器是调用者传入的原始对象的迭代器,而不是存储在局部变量中的临时副本的迭代器。

您看到的行为是未定义的,因此它只是碰巧正确打印前三个和后两个。

 类似资料:
  • 本文向大家介绍C ++程序中的迭代器无效,包括了C ++程序中的迭代器无效的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论一个程序,以了解C ++中的迭代器失效。 在容器对象的元素上进行迭代时,有时如果我们不应用绑定检查,它可能会失效。这主要是由于容器对象的形状和大小的变化而发生的。 示例 输出结果 (可能还会发生,添加新元素时,矢量将被复制到新位置,而我们的迭代器仍指向旧位置,这

  • 一个自动点唱机只有一首歌恐怕不会太流行,所以我们需要建立一个歌曲目录和一个等待播放的列表。这都是容器的例子,一个包含若干个对其它对象引用的对象。 目录和播放列表都有类似的操作,增加歌曲,删除歌曲,返回歌曲列表等等。播放列表可能还需要别的方法,比如插入广告,记录累计播放时间等,我们将在后面考率这些问题。现在,我们需要建立一个SongList类,以便在目录和播放列表中使用。 容器 在开始实现之前,我们

  • 最常见的类型包括容器类(container class),也称集合类(collection class),是保存一组对象集合的类。容器类通常提供插入、删除、查找、排序和测试类成员项目等操作。数组、堆栈、队列、树和链表都是容器类,第4章介绍了数组,第11章和20章将介绍其他数据结构。 容器类经常与迭代对象(iterator object;或简称迭代器,aerator)相关联。迭代对象返回集合中的下一

  • 最受欢迎的C迭代器失效规则帖子声称,不清楚过去的结束迭代器(即,、、、和)是否根据与普通迭代器相同的规则失效,这些迭代器指向容器中的元素。这些针对2003年和2011年C版的声明都遵从了一篇讨论结束迭代器失效规则的帖子,其中公认的答案表明2003年的标准在这个问题上是模糊的。这一结论基于23.1/10(在的上下文中)中的一条评论,该评论似乎暗示,当规范没有明确提到结束迭代器失效时,它们可能会失效。

  • 问题内容: 您能想到一种很好的方法(也许使用itertools)将迭代器拆分为给定大小的块吗? 因此,with成为迭代器 我可以想到一个小程序来做到这一点,但是使用itertools并不是一个好方法。 问题答案: 在 从配方文件的食谱来靠近你想要什么: 但是,它将使用填充值填充最后一个块。 较不通用的解决方案仅适用于序列,但可以根据需要处理最后一个块 最后,一种可在一般迭代器上运行且其行为符合预期

  • 迭代器 乍看来,迭代器似乎很直观。但凑近了看,你会发现标准STL容器提供了四种不同的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。很快你会注意到在这四种类型中,容器的insert和erase的某些形式只接受其中一种。那是问题的开始。为什么有四种迭代器?它们之间的关系是什么?它们可以互相转化吗?在调用算法和ST