你能给自己分配一个 std::string 的子字符串吗?
Can you assign a substring of a std::string to itself?
我最近发现需要用自己的子字符串替换std::string
的内容。我认为在这里调用的最合乎逻辑的函数如下,来自 http://www.cplusplus.com/reference/string/string/assign/:
substring (2) string& assign (const string& str, size_t subpos, size_t sublen);
复制从字符位置子座开始并跨越子字符的 str 部分(如果 str 太短或子词是字符串::npos,则直到 str 的末尾)。
str 另一个字符串对象,其值被复制或移动。子字
str 中作为子字符串复制到对象的第一个字符的位置。如果这大于str的长度,则抛出out_of_range。注意:str 中的第一个字符用值 0(而不是 1)表示。苏普伦
要复制的子字符串的长度(如果字符串较短,则复制尽可能多的字符)。 字符串::npos 的值表示 str 末尾之前的所有字符。
但是,我不确定这是否允许,或者它是否会损坏字符串数据。我知道memcpy()
,例如,不允许(或至少不保证在以下情况下不损坏)用自身(的一部分)覆盖内存区域(参见 memcpy() vs memmove())。但我不知道上述方法是否具有相同的限制。
更一般地说,您能否评论我是否应该自己找出这个问题的答案?我链接到的文档中没有任何内容让我清楚这个问题的答案是什么,除了 str
参数描述中的限定符"Other"("另一个字符串对象"),这似乎暗示它不可能是这个对象,尽管我不认为这是明确的。这是文档中的弱点吗?
No.
此操作由 [string::assign]/4 定义:
basic_string& assign(const basic_string& str, size_type pos, size_type n = npos);
效果:确定要分配的字符串的有效长度
rlen
作为较小的n
和str.size() - pos
和呼叫assign(str.data() + pos rlen)
.
(打错字)
然后:
basic_string& assign(const charT* s, size_type n);
效果:将
*this
控制的字符串替换为字符串 长度n
其元素是s
所指元素的副本。
这并没有说明str.assign(str, 0)
是否安全(特别是,我们无法知道每个字符的副本何时会出现!
因此,我强烈建议您避免这样做。
不要尝试。
它可能有效,但正如所选答案中所建议的那样,无法确保安全。 在最好的情况下,根据您的实现,将创建一个临时对象,然后销毁。
模拟它的一种方法如下,它不会创建临时对象,并且确实比调用assign
和substr
更快:
void trimTo(string & s, size_t pos = 0, size_t len = string::npos)
{
s.erase(pos + len);
s.erase(pos, len);
}
然后
trimTo(myString, fromPos, numChars);
工作为
myString.assign(myString.substr(fromPos, numChars);
但它至少快了两倍。
显然,这与 operator= (防止自我分配)的决定相同。
_Myt& assign(const _Myt& _Right,
size_type _Roff, size_type _Count = npos)
{ // assign _Right [_Roff, _Roff + _Count)
_Right._Check_offset(_Roff);
_Count = _Right._Clamp_suffix_size(_Roff, _Count);
if (this == &_Right)
erase((size_type)(_Roff + _Count)), erase(0, _Roff); // substring
else if (_Grow(_Count))
{ // make room and assign new stuff
_Traits::copy(this->_Myptr(),
_Right._Myptr() + _Roff, _Count);
_Eos(_Count);
}
return (*this);
}
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- C++:考虑C++ std::string 中双引号 (") 的字面含义,而不使用反斜杠 (\)
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- C++ 在列表和列表之间选择返回类型<<string>std::p air<string,string>>
- std::string, std::wstring and UTF8
- uan inplace replacement of std::string/std::wstring?
- #define Glib::string std:wstring
- 从 std::string & std::wstring 中获取 char 整数值
- BSTR转换为std::string(std::wstring),反之亦然