C++ 在C++';STL是否实际删除了该元素?

C++ 在C++';STL是否实际删除了该元素?,c++,stl,C++,Stl,对于以下代码: list<int> P; int i,n,x; cin>>n>>x; for(i=0;i<n;i++) P.push_back(i+1); list<int>::iterator t2,t1=P.begin(); advance(t1,x-1); t2=t1; t1++; P.erase(t1); t2++; cout<<*t2<<" "; cout<<*(P.end())<

对于以下代码:

 list<int> P;
int i,n,x;
cin>>n>>x;
for(i=0;i<n;i++)
    P.push_back(i+1);
list<int>::iterator t2,t1=P.begin();
advance(t1,x-1);
t2=t1;
t1++;
P.erase(t1);
t2++;
cout<<*t2<<" ";
cout<<*(P.end())<<endl;
列表P;
int i,n,x;
cin>>n>>x;
对于(i=0;i
C++STL中的erase()是否确实删除了元素

是。
擦除
会破坏元素

但这将是列表的末尾

*(P.end())
end
返回结束迭代器。取消引用该迭代器具有未定义的行为。您可以使用
back
获取最后一个元素

C++STL中的erase()是否确实删除了元素

是。
擦除
会破坏元素

但这将是列表的末尾

*(P.end())

end
返回结束迭代器。取消引用它具有未定义的行为。可以使用
back
获取最后一个元素。

调用
erase()
时,它会删除内部存储中的元素

您可以执行以下测试来测试它:

int main()
{
    vector<int> x = {3, 4, 5, 6};
    int * temp  = &x[1];
    cout<<*temp<<endl;
    x.erase(x.begin() + 1);
    cout<<*temp<<endl;

}
这显示了擦除删除元素并移动其位置中的所有元素


希望这有帮助。

当您调用
erase()
时,它会删除内部存储器中的元素

您可以执行以下测试来测试它:

int main()
{
    vector<int> x = {3, 4, 5, 6};
    int * temp  = &x[1];
    cout<<*temp<<endl;
    x.erase(x.begin() + 1);
    cout<<*temp<<endl;

}
这显示了擦除删除元素并移动其位置中的所有元素


希望这有帮助。

*(p.end())
是未定义的行为,因为根据定义,
std::vector::end
超过了
std::vector
的末尾。那么我如何签入O(1)5是否是列表中的最后一个元素?这个函数是std::list::end。我完全不明白你的意思,我是一个初学者。std::list::back()获取最后一个元素。请看,未定义的行为意味着任何事情都可能发生。虽然语言没有试图阻止你,但你不允许取消引用P.end()@Tanay抱歉,没有完整阅读示例,并假设您使用的是
std::vector
。不过-迭代器功能在所有容器中都是相同的-取消引用
end()
是未定义的行为(即任何输出都是有效的)。要访问最后一个元素(假设非空列表),可以使用。
*(P.end())
是未定义的行为,因为根据定义,
std::vector::end
超过了
std::vector
的末尾。那么我如何在O(1)中检查5是否是列表中的最后一个元素?这个函数是std::list::end。我完全没有理解你的意思,我是个初学者。std::list::back()获取最后一个元素。请参阅未定义的行为意味着任何事情都可能发生。尽管该语言不会试图阻止您,但不允许您取消对P.end()的引用@Tanay抱歉,没有完全阅读示例,并假设您使用的是
std::vector
。不过-迭代器功能在所有容器中都是相同的-取消引用
end()
是未定义的行为(即任何输出都是有效的)。要访问最后一个元素(假设非空列表),可以使用。