erase函数「vector erase函数」
string类中erase函数的实现怎样的
1.声明C++字符串
声明字符串变量简单:

string Str;
我声明字符串变量既类构造函数析构函数面声明没传入参数所直接使用string默认构造函数函数所作Str初始化空字符串String类构造函数析构函数:
a) string s; //空字符串s
b) string s(str) //拷贝构造函数 str**品
c) string s(str,stridx) //字符串str内始于位置stridx部作字符串初值
d) string s(str,stridx,strlen) //字符串str内始于stridx且度顶strlen部作字符串初值
e) string s(cstr) //C字符串作s初值
f) string s(chars,chars_len) //C字符串前chars_len字符作字符串s初值
g) string s(num,c) //字符串包含numc字符
h) string s(beg,end) //区间beg;end(包含end)内字符作字符串s初值
i) s.~string() //销毁所字符释放内存
都简单我解释
2.字符串操作函数
C++字符串重点我先各种操作函数罗列喜欢所函数都看完找自喜欢函数再面看详细解释
a) =,assign() //赋新值
b) swap() //交换两字符串内容
c) +=,append(),push_back() //尾部添加字符
d) insert() //插入字符
e) erase() //删除字符
f) clear() //删除全部字符
g) replace() //替换字符
h) + //串联字符串
i) ==,!=,,,=,compare() //比较字符串
j) size(),length() //返字符数量
k) max_size() //返字符能数
l) empty() //判断字符串否空
m) capacity() //返重新配前字符容量
n) reserve() //保留定量内存容纳定数量字符
o) [ ], at() //存取单字符
p) ,getline() //stream读取某值
q) //谋值写入stream
r) copy() //某值赋值C_string
s) c_str() //内容C_string返
t) data() //内容字符数组形式返
u) substr() //返某字符串
v)查找函数
w)begin() end() //提供类似STL迭代器支持
x) rbegin() rend() //逆向迭代器
y) get_allocator() //返配置器
C++erase函数的使用
v.erase(j-1,j);
有两个错误
越界
用法错误
正确的用法为
vectorstring::iterator t = v.begin();//相当于取数组第一个元素
v.erase(t);//删除
C++erase的问题
erase()函数的功能是用来删除容器中的元素。
函数原型:
iterator erase(iterator where);
iterator erase(iterator first,iterator last);
basic_string erase(size_type p0=0,size_type n=np);
删除某个容器里的某个元素:c.erase(T);
链表容器以list为例,执行container.erase(it)。
listint::iterator it;
for (it = lt.begin(); it != lt.end(); ) {
if (*it % 2 == 0)
lt.erase(it++);
else
++it;
}
C++中的erase操作
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就可以。
C++:erase删除容器中元素
这地方改一下:
if ( *iter == 3 )
{
iter = vec.erase( iter );
}
或者
if ( *iter == 3 )
{
vec.erase( iter );
break;
}
iter原先指向3这个元素,使用erase之后,这个迭代器失效了,所以在下次循环else这个语句块内,
++iter是非法的。