【发布时间】:2019-07-03 14:38:52
【问题描述】:
我最近观察到修改自动迭代向量内的数据对我来说并没有产生正确的结果。例如,当我尝试对vector的vector元素进行排序时,有些元素没有排序但代码运行成功
vector<vector<int> > arr;
arr.push_back({38, 27});
for(auto v : arr)
{
sort(v.begin(), v.end());
}
上述代码排序后的输出还是38,排序后的27。而当我排序为 sort(arr[0].begin(), arr[0].end()) 时,结果是正确的。我使用 gcc 编译。
【问题讨论】:
-
为什么你认为结果是不确定的?
-
"为什么 C++ 编译器在结果确定未定义时允许这样做?" 有更简单的代码示例显示未定义行为,编译成功:
int* pa; {int a = 5; pa = &a;} *pa = 1;跨度> -
实际上,我遇到过一些不幸的情况,我试图在基于 for 循环的范围内修改容器本身,并得到未定义的结果,我认为同样的情况也适用于这段代码。既然我得到了答案,我将更改问题以使其具有通用性,而不是要求解决错误的假设。