C++:erase删除容器中元素 结果为何是这样的呢??
#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>vec;vector<i...
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
vector<int>::iterator iter;
for ( int i = 0; i < 10; i++ )
{
vec.push_back( i );
}
for ( iter = vec.begin(); iter != vec.end(); )
{
if ( *iter == 3 )
{
vec.erase( iter );
}
else
{
++iter;
}
}
cout << "剩余元素:" << endl;
for ( iter = vec.begin(); iter != vec.end(); ++iter )
{
cout << *iter << " ";
}
cout << endl;
return 0;
}
这段程序很简单:
原来存的是 0 1 2 3 4 5 6 7 8 9
剩余元素是 0 1 2 4 5 6 7 8 9
但是索引3的位置的值并没有被删除 而只是变成4了啊
也就是删除之后这10个空间的值分别是 0 1 2 4 4 5 6 7 8 9 这样算删除了么?
是不是这样用迭代器访问不到了 但是按索引访问还是能访问到呢?
我用的是vector
是连续内存空间不是链表啊
而且3的位置是4 那4的位置为什么也是4呢? 展开
#include <vector>
using namespace std;
int main()
{
vector<int> vec;
vector<int>::iterator iter;
for ( int i = 0; i < 10; i++ )
{
vec.push_back( i );
}
for ( iter = vec.begin(); iter != vec.end(); )
{
if ( *iter == 3 )
{
vec.erase( iter );
}
else
{
++iter;
}
}
cout << "剩余元素:" << endl;
for ( iter = vec.begin(); iter != vec.end(); ++iter )
{
cout << *iter << " ";
}
cout << endl;
return 0;
}
这段程序很简单:
原来存的是 0 1 2 3 4 5 6 7 8 9
剩余元素是 0 1 2 4 5 6 7 8 9
但是索引3的位置的值并没有被删除 而只是变成4了啊
也就是删除之后这10个空间的值分别是 0 1 2 4 4 5 6 7 8 9 这样算删除了么?
是不是这样用迭代器访问不到了 但是按索引访问还是能访问到呢?
我用的是vector
是连续内存空间不是链表啊
而且3的位置是4 那4的位置为什么也是4呢? 展开
2个回答
展开全部
楼主您理解错误了。erase将元素值为3的元素已经删除,容器内剩下的值已经没有3了。这点从后面的一个for循环就可以看出,并没有输出3。
按照索引访问的结果也是一样:
for(int j = 0;j<vec.size();j++)
cout << vec[j] << " ";
cout << endl;
加上如上代码,就可以看到输出结果也是没有3的。
满意记得采纳,有问题请追问。谢谢!!
按照索引访问的结果也是一样:
for(int j = 0;j<vec.size();j++)
cout << vec[j] << " ";
cout << endl;
加上如上代码,就可以看到输出结果也是没有3的。
满意记得采纳,有问题请追问。谢谢!!
更多追问追答
追问
但是如果挨个访问vector中的元素
例如:vector[0],vector[1]....vector[9]的话
输出的就是 0 1 2 4 4 5 6 7 8 9 了啊
3是没有了 4怎么还变成两个了呢?
追答
您把我上面贴的那个for循环贴上了吗?没有输出2个4啊。结果就是0 1 2 4 5 6 7 8 9。
其次,不应该再使用vec[9]了。因为删除一个元素过后,vec的大小应该是10-1=9.这意味着只有从vec[0]到vec[8]是有效的。vec[9]虽然存在,但只是以前的值,不属于合法元素了。
展开全部
没有这个stl是动态指针不是数组啊,你想象成链表吧其实他是把中间哪一个空间拿走然后杀掉,把后面的挂上去 ,所以你直接访问3那个位置其实已经是4了,你可以访问以下9位置试试
cout<<vec[4];
cout << endl;
这个位置里面是5
应该是0124567899
template<typename _Alloc>
class vector<bool, _Alloc> : public _Bvector_base<_Alloc>
{
public:
typedef bool value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Bit_reference reference;
typedef bool const_reference;
typedef _Bit_reference* pointer;
typedef const bool* const_pointer;
看一下vector的成员吧,里面用的指针
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
cout<<vec[4];
cout << endl;
这个位置里面是5
应该是0124567899
template<typename _Alloc>
class vector<bool, _Alloc> : public _Bvector_base<_Alloc>
{
public:
typedef bool value_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Bit_reference reference;
typedef bool const_reference;
typedef _Bit_reference* pointer;
typedef const bool* const_pointer;
看一下vector的成员吧,里面用的指针
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
追问
原来是这种输出结果 那为什么最后是99呢:) vector的长度已经固定了 删除了之后虽然3是没有了但是3那个地方会被4替代 4会被5替代....到最后为什么会是放个9呢:)嘿嘿
追答
那个是原来的数据了,就是已经属于不用的位置你如果同end或者size都不会访问他了,就像废弃的房屋就等着被拆迁重建了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询