控制流与迭代

0

的问题

说我有事情是这样的:

void myFunk(std::vector<T>& v, std::vector<T>::iterator first, std::vector<T>::iterator last) {
    while (first != last) {
        if ((*first) > (*last)) {
            T someT;
            v.push_back(someT);
        }
        first++;
    }
}

int main(){
    std::vector<T> foo = {some, T, values};
    myFunky(foo, foo.begin(), foo.end())
    return 0;
}

这将导致一个无限循环,或者将它结束后 foo.size() 迭代? 换句话说,会的 last 迭代进行更新 foo 的增长,或将它保留的价值给予在功能的电话?

我假设 last 会改变,因为它是一个指向一个位置,但想一些的确认。

c++ controls flow iterator
2021-11-18 16:56:38
1

最好的答案

0

这将导致一个无限循环,或者将它结束后 foo.size() 迭代?

两者都不是。 你在做什么是 不确定的行为,对于几个原因:

  • 你修改的 vector 虽然循环。

    如果矢量重新分配其内部的存在推动一个新项目,所有现有的迭代进入 vector无效的,包括两个迭代使用循环。 但是,即使只是推动一个新项目的总是无效的 end() 迭代,至少。

    迭代无效的规则C++的容器

  • 你是取消引用 end() 迭代,这不是指一个有效单元。

我假设 last 会改变,因为它是一个指向一个位置

它不能改变,因为你通过它进入的 myFunc 功能的价值,因此它是一个 复制 的原件 end() 迭代器。 如果 end() 改变价值, last 不会改变价值,因为这是一个 复制.

在任何情况下,迭代不一定是实现为指针,但指针是有效的迭代器。 但是,不管在这种情况。 甚至如果 vector::iterator 只是一个简单的指针, last 仍然会得到无效后,每一个推/重新分配。

2021-11-18 21:20:33

通过价值是蓄意的-当时的想法是 试图 使该矢量的迭代,在当前价值,而后追加新的结束。 有意义的,我正在存储器访问侵犯行为在运行时间。 谢谢你的无效规则插(我知道我一直在寻找记录,但不知道如何描述)。 谢谢你答案的人。 真的很清除的事情了。 干杯!
Pedro Barbeira

我将建议缓存插入一个当地的矢量,然后添加到结束目标矢量之后的迭代的结束。
Remy Lebeau

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................