社区
C++ 语言
帖子详情
大家说说,std::string删除最后一个字符最高效的方法是哪个?
DarknessTM
2005-06-16 11:58:45
strData.erase(strData.end()-1) ??
...全文
3456
27
打赏
收藏
大家说说,std::string删除最后一个字符最高效的方法是哪个?
strData.erase(strData.end()-1) ??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
C++ |
删除
std
::
string
或
std
::w
string
的
最后
一个
字符
:
//
方法
1 s.pop_back(); //从s中移走
最后
一个
元素。在
string
/w
string
中相当于移走
最后
一个
char/wchar_t。这个
方法
算是比较简单的了。 //
方法
2 s.erase(s.end()-1); //
删除
s的
最后
一个
字符
//
方法
3 s=s.substr(0,s.length()-1); //取出s从最开始到倒数第二个
字符
之间的
字符
串,赋值给s。相当于去...
C++-容器-
string
:从
string
字符
串中获取
最后
一个
字符
【
std
::
string
::back()】【
std
::
string
::at(size - 1)】
本文将教授 C++ 中从
字符
串中获取
最后
一个
字符
的不同
方法
。我们可以使用 从
字符
串中提取出现在给定位置的
字符
。语法: 这将返回用户指定的 处指定位置的
字符
。当传递了无效的索引号时,该
方法
会抛出 异常,例如小于零的索引或大于或等于 的索引。示例:提取
最后
一个
字符
和给定位置的
字符
。 为了得到
最后
一个
位置的
字符
,我们首先找到
字符
串的长度,并在
方法
中传递 。输出: 在 C++ 中使用
std
::
string
::back() 从
字符
串中获取
最后
一个
字符
C++ 中的 给出了对
字符
串最
std
::
string
std
::
string
对象通常包含了
一个
指向堆上分配的内存的指针,用于存储较长的
字符
串。较短的
字符
串可能会直接存在对象本身的内部缓冲区,有些实现还会使用
一个
独立的缓冲区来存储
字符
串内容。
std
::
string
(const
std
::
string
& str):拷贝构造函数,深拷贝。append(
std
::
string
& other):在
字符
串末尾添加
一个
字符
串。swap(
std
::
string
& other):交换两个
字符
串的内容。
std
::
string
():默认构造
一个
空
字符
串。
去掉
std
::
string
或
std
::w
string
的
最后
一个
字符
的简单
方法
s.pop_back(); s.erase(s.end()-1); s.substr(0,s.length()-1);
C++中
std
::
string
与C-
String
字符
数组的互相转换
C语言中只有
字符
数组这一
说
法,没有C++专门封装的
字符
串类
std
::
string
。而
字符
数组C-
String
以\0作为结束符。
std
::
string
其实还是存储了C-
String
这个指针,只不过不同的编译期对
std
::
string
中的存储结构都做了不同的处理,这里我们不讨论
std
::
string
的实现,只关心一件事,那就是C-
String
和
std
::
string
的相互转换。 C-
String
2 ...
C++ 语言
65,176
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章