C++中的erase *** 作

C++中的erase *** 作,第1张

if(isupper(*iter)){

iter = s.erase(iter)

--iter

}

问题在这里 iter = s.erase(iter)

注意std::string 实际上里面是个动态 char[]

迭代器内部的内容实际是个char*

那么当erase后 数组长度发生变化

根据动态数组的概念 是不是会发生

char* new_p = new char[new_length]

memcpy(new_p, old_p, new_length)

那么原来的指针还能用吗??

所以你这个功能应该使用 std::remove_if

同样的 vector也不能使用这样的 *** 作

但是类似 *** 作 list就可以。

Private Sub Form_Click()

Dim a() As Integer

ReDim a(5)

a(5) = 50

Print a(5)

Erase a 这时已经删除a了,

Dim b() As Integer

ReDim b(5)

b(5) = 100

Print a(5) 这里你还用a,当然会出错

Print b(5)

End Sub

对于vector一般不要用erase(),因为很多情况下他要和<algorithm>中的remove()一块用!erase()的使用会使迭代器失效如果删除的不是最后面的元素的话。你的程序中if(*iter%2==0)

ivec.erase(iter)

可以换成:(记着加头文件<algorithm>)

if

(*iter%2

==

0)

ivec.erase(remove(ivec.begin(),

ivec.end(),

*iter),

ivec.end())

但如果你用if

(*iter%2

!=

0)

ivec.erase(remove(ivec.begin(),

ivec.end(),

*iter),

ivec.end())

输出结果则包含11,结果错误!

不知道你为什么数组,向量,链表都用,为了和你一致,我也只能改成这样:

#include

<iostream>

#include

<vector>

#include

<list>

#include

<algorithm>

#include

<functional>

#include

<iterator>

using

namespace

std

int

main

()

{

vector<int>

ivec

list<int>

ilis

int

vec[]

=

{2,

3,

4,

5,

6,

7,

8,

9,

10,

11}

remove_copy_if

(vec,

vec+10,

back_inserter(ivec),

bind2nd(modulus<int>(),

2))

remove_copy_if

(vec,

vec+10,

back_inserter(ilis),

not1(bind2nd(modulus<int>(),

2)))

for

(vector<int>::const_iterator

iter

=

ivec.begin()

iter

!=

ivec.end()

++iter)

cout

<<

*iter

<<

'\t'

cout

<<

endl

for

(list<int>::const_iterator

liter

=

ilis.begin()

liter

!=

ilis.end()

++liter)

cout

<<

*liter

<<

'\t'

cout

<<

endl

}

最好的做法是:

#include

<iostream>

#include

<vector>

#include

<list>

#include

<algorithm>

#include

<functional>

#include

<iterator>

using

namespace

std

int

main

()

{

vector<int>

ivec,

odd_vec,

even_vec

for

(int

i

=

2

i

!=

12

++i)

ivec.push_back(i)

remove_copy_if

(ivec.begin(),

ivec.end(),

back_inserter(even_vec),

bind2nd(modulus<int>(),

2))

remove_copy_if

(ivec.begin(),

ivec.end(),

back_inserter(odd_vec),

not1(bind2nd(modulus<int>(),

2)))

copy

(even_vec.begin(),

even_vec.end(),

ostream_iterator<int>(cout,

"\t"))

cout

<<

endl

copy

(odd_vec.begin(),

odd_vec.end(),

ostream_iterator<int>(cout,

"\t"))

cout

<<

endl

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11283925.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存