C++ Primer中提到的容器赋值操作问题

问题描述 投票:0回答:1

《C++ Primer》Section 9.2, Table 9.4, 有一项关于

seq.assign(b, c)

迭代器 b 和 e 不能引用 seq.

中的元素

但是,当我尝试使用

seq.begin()
seq.end()
分配回
seq
时,没问题。所以我对这个项目感到困惑,或者我误解了它。

以下代码运行成功并输出

2 3 4
.

#include<iostream>
#include<vector>

int main(){
    std::vector<int> b{1, 2, 3, 4};
    b.assign(b.begin() + 1, b.end());
    std::cout << b[0] << ' ' << b[1] << ' ' << b[2];
    return 0;
}

我知道

assign()
会使左侧容器中的迭代器失效,但是实现中发生了什么?破坏发生在任务之前还是之后?

c++ vector stl iterator assign
1个回答
2
投票

查看您的代码并阅读 https://en.cppreference.com/w/cpp/container/vector/assign,很明显您正在导致 undefined behavior。这意味着任何事情都可能发生——它可能正常工作,它可能崩溃,或者它可能输出不正确的数据,或者更糟的事情。并不是说运行同一个程序两次甚至会产生相同的未定义行为结果。

所以,是的,就正确的代码而言,展示一个可以正常工作的玩具示例毫无价值,而且您的代码存在错误。

当函数输入的前提条件像这里一样清楚地说明时,你一定不能偏离,否则你会得到不可靠的从而破坏行为。

© www.soinside.com 2019 - 2024. All rights reserved.