大家说说,std::string删除最后一个字符最高效的方法是哪个?

DarknessTM 2005-06-16 11:58:45
strData.erase(strData.end()-1) ??
...全文
3456 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovevc 2005-06-20
  • 打赏
  • 举报
回复
>>我以前实现过一个 string 类,里面处理这个东西的方法自诩还是比较得意的,拿来与诸君分享

探讨以下, 我觉得你这个Strng class中
size_t length()
{
if ( !data_ ) return 0;

函数实现得不够好.
data_是否可以为null? 如果可以, 那么并没有在其他地方体现, 如果不可以, 那么判断就没有必要.
你这个class中维持的"不变式"到底是什么?
LoveCreatesBeauty 2005-06-20
  • 打赏
  • 举报
回复
whoever knows what the OP want, use erase() to delete letters is the way.
yhbttfile 2005-06-19
  • 打赏
  • 举报
回复
同意“fangrk(加把油,伙计!) ”的说法。

还有提醒一下的是:
str[str.size() - 1] = '\0'
上面的语义只是把最后一个字符设置为'\0',str的长度并没有减少。string内部不会区分字符的值,不像C-STRING。
fangrk 2005-06-18
  • 打赏
  • 举报
回复
使用size()或者end()都是可以的,之间的效率差异可以说微乎其微,总不见的要查看源代码才能决定使用哪个函数吧?首先应该判断str.empty(),否则都是白搭。
zjqyb 2005-06-18
  • 打赏
  • 举报
回复
strData.resize(strData.size()-1)
yangman211 2005-06-18
  • 打赏
  • 举报
回复
up
Wolf0403 2005-06-18
  • 打赏
  • 举报
回复
丢了 N 多分号,郁闷……
xlsue 2005-06-18
  • 打赏
  • 举报
回复
string中怎么可以用'\0'来标识呢?跟Cstring可不一样啊!
Wolf0403 2005-06-18
  • 打赏
  • 举报
回复
我以前实现过一个 string 类,里面处理这个东西的方法自诩还是比较得意的,拿来与诸君分享

class String
{
char *data_;
int len_
public:
String ( const char *str, size_t len ):len_(len)
{
data_ = new char[len_+1];
strncpy ( data_, str, len_ );
data_[len_] = '\0'
}
~String () { delete[] data_; }

size_t length()
{
if ( !data_ ) return 0;

if ( len_ < 0 )
len_ = strlen(data_);
return len_;
}

size_t length() const
{
return data_ == NULL ? 0 :
( len_ < 0 ? strlen(data_) : len_ );
}

char & operator[](size_t index)
{ assert(data_); len_ = -1; return data_[index]; }
const char & operator[] (size_t index) const
{ assert(data_); return data_[index]; }
};
Beover1984 2005-06-17
  • 打赏
  • 举报
回复
string类中应该有记录数据长度的成员,size()并不是完全遍历,所以效率没问题,
但是直接strData[strData.size()-1] = '\0'这样并不会改变以的size()值,会产生问题的
WoodJohn 2005-06-17
  • 打赏
  • 举报
回复
学习...
sunman1982 2005-06-17
  • 打赏
  • 举报
回复
回复人: fangrk(加把油,伙计!) ( ) 信誉:125 2005-6-16 16:31:46 得分: 0



if(strData.empty()==false) strData.erase(strData.end()-1);

str.size()的过程就是一个遍历的过程,我不认为这个算法的效率高。——我觉得string::size()是一个效率很高的函数,不必遍历。要知道,string::iterator是随机存储性质的



===============
恩,看了一下源代码伐size(),这个函数不需要遍历,只是返回勒一个数值。
还有就是rbegin()的实现是依靠end()这个函数,而end()这个函数的实现是依靠size()。
size()的时间是o(1)的。
这下效率最高的是什么方法我想大家也一目了然勒。
ikiki 2005-06-17
  • 打赏
  • 举报
回复
str[str.size() - 1] = '\0' 是病态的,用了之后你就会发现 str.length() 和 strlen(str.c_str()) 不相等了
Wolf0403 2005-06-17
  • 打赏
  • 举报
回复
std::string 的输出是根据记录的长度而不是 '\0' 来判断结束的,所以 strData[] 这种方法不可取。
pappGG 2005-06-17
  • 打赏
  • 举报
回复
楼上那你还用std::string作社么,不如就char *好了^^

删除还是用erase比较好
KenYuan2016 2005-06-17
  • 打赏
  • 举报
回复
用的时候不取最后一位不就得了,干吗一定要删除呢?
用的时候只取前面的N-1位,这不更高效吗?
DarknessTM 2005-06-16
  • 打赏
  • 举报
回复
没人?
DarknessTM 2005-06-16
  • 打赏
  • 举报
回复
我本来在使用中是用strData[strData.lenth()-1] = 0
可惜在之后的,strData+= 的运算就出现问题了,唉
LoveCreatesBeauty 2005-06-16
  • 打赏
  • 举报
回复
#include <string>
#include <iostream>
using namespace std;

inline string& erase_str_end(string& str){
*(--str.end()) = '\0';
return str;
}
fangrk 2005-06-16
  • 打赏
  • 举报
回复
if(strData.empty()==false) strData.erase(strData.end()-1);

str.size()的过程就是一个遍历的过程,我不认为这个算法的效率高。——我觉得string::size()是一个效率很高的函数,不必遍历。要知道,string::iterator是随机存储性质的
加载更多回复(7)

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧