C++ 从向量和成对向量中删除元素的区别

C++ 从向量和成对向量中删除元素的区别,c++,vector,std-pair,C++,Vector,Std Pair,上面的代码抛出错误,因为可以理解p.end指向空指针 下面的代码运行正常,输出为30 60。有人能解释一下吗 #include <bits/stdc++.h> using namespace std; int main() { vector<int>p; p.push_back(30); p.push_back(60); p.push_back(20); p.erase(p.end()); for(int i = 0

上面的代码抛出错误,因为可以理解p.end指向空指针

下面的代码运行正常,输出为30 60。有人能解释一下吗

#include <bits/stdc++.h>
using namespace std;

int main() 
{
    vector<int>p;
    p.push_back(30);
    p.push_back(60);
    p.push_back(20);

    p.erase(p.end());

    for(int i = 0; i < p.size(); ++i)
    cout<<p[i]<<" ";
}
发件人:

迭代器pos必须有效且可取消引用。因此,有效但不可取消引用的结束迭代器不能用作pos的值

因此,您的代码在这两种情况下都是无效的,并且调用。这意味着任何事情都可能发生,包括崩溃、工作或任何它想要的事情

上面的代码抛出错误,因为据了解

该代码不能保证抛出错误。相反,这种行为是未定义的。抛出错误是一种可能的行为。如果它确实抛出了一个错误,您可以认为自己是幸运的,因为否则可能很难找到您的bug

。。。众所周知,p.end指向空指针

否,p.end不指向空指针。它指向向量的末端,其中向量的末端被定义为最后一个元素之后的位置

下面的代码运行正常,输出为30 60。有人能解释一下吗

#include <bits/stdc++.h>
using namespace std;

int main() 
{
    vector<int>p;
    p.push_back(30);
    p.push_back(60);
    p.push_back(20);

    p.erase(p.end());

    for(int i = 0; i < p.size(); ++i)
    cout<<p[i]<<" ";
}
当行为未定义时,运行良好且输出为30 60是可能的行为。任何事物在未定义时都是可能的行为。但当然,也不能保证它会运行良好。就语言而言,该程序明天也不可能运行良好


我已经在许多在线编译器上检查过了,但是输出是一样的

当行为未定义时,在许多在线编译器上输出相同也是可能的行为。不能保证某些编译器的行为会有所不同,正如不能保证它们的行为相同一样


无论您尝试了多少编译器,都不可能仅仅通过执行程序并观察您希望的输出来验证程序是否正确。证明程序正确的唯一方法是验证施加在程序上的所有先决条件和不变量是否满足。

p.erasep.end;在这两种情况下都是越界访问,因此它调用未定义的行为。你应该远离鼓吹这种胡说八道的网站。下面的代码运行良好,输出30 60!!未定义行为的一个可能影响是运行正常。另一个似乎运行良好,但在不同的系统或编译器上崩溃。我在许多在线编译器上检查过它,但输出是相同的!!请检查程序的输出。它会一直工作,不会输出垃圾值。我在许多在线编译器上检查过它,但输出是一样的!!我的疑问是,在向量为对的情况下,为什么p.erasep.end没有给出任何错误?因为p.end没有指向最后一个元素,它指向最后一个元素旁边的位置。@Vikaschudhary,但正如我在回答中所说,这不能保证给出任何错误。当无法保证会有错误时,为什么您会期望出现错误?我的疑问是,为什么p.erasep.end在向量对和擦除最后一个元素的情况下没有给出任何错误???@vikaschoudhary,因为行为是未定义的。就像int a[4];[6]=10是未定义的。这可能会起作用,或者失败,或者崩溃,或者其他什么。不值得讨论未定义的行为可以做什么,也可能不做什么。