你能为自己分配一个std :: string的子字符串吗?

bgo*_*dst 21 c++ string

我最近发现需要std::string用自己的子串替换内容.在这里调用最合乎逻辑的函数我认为如下,来自http://www.cplusplus.com/reference/string/string/assign/:

substring(2)      string&assign(const string&str,size_t subpos,size_t sublen);
    
     复制从字符位置subpos开始的str部分并跨越sublen字符(或者直到str的结尾,如果str太短或者如果sublen是string :: npos).

     str
         另一个字符串对象,其值可以复制或移动.

     subpos
         作为子字符串复制到对象的str中第一个字符的位置.如果这大于str的长度,则抛出out_of_range.注意:str中的第一个字符用值0表示(不是1).

     sublen
         要复制的子字符串的长度(如果字符串较短,则复制尽可能多的字符).string :: npos的值表示直到str结尾的所有字符.

但是,我不确定这是否允许,或者它是否可以破坏字符串数据.我知道memcpy(),例如,不允许(或至少不能保证的情况下,非腐败)覆盖的内存区域用(的一部分)本身(见的memcpy()VS的memmove() ).但我不知道上述方法是否有相同的限制.

更一般地说,如果我能够自己找出这个问题的答案,请你评论一下吗?我没有什么链接到该文件中清楚地给我这个问题的答案是什么,除了可能的限定词"另一个"在的描述str参数(" 另一个字符串对象"),这似乎意味着它不能在对象,虽然我不觉得这是毫不含糊的.这是文档中的弱点吗?

Lig*_*ica 5

不。

该操作由 [string::assign]/4 定义:

basic_string& assign(const basic_string& str, size_type pos,
    size_type n = npos);
Run Code Online (Sandbox Code Playgroud)

效果: 确定要分配为和和 调用rlen中较小者的字符串的有效长度。nstr.size() - posassign(str.data() + pos rlen)

数据错别字

然后:

basic_string& assign(const charT* s, size_type n);
Run Code Online (Sandbox Code Playgroud)

效果: 将 控制的字符串替换为*this长度为 的字符串n,该字符串的元素是 指向的字符串的副本s

这并没有说明是否str.assign(str, 0)安全(特别是,我们无法知道每个角色的副本何时会发生!)。

因此我强烈建议你避免这样做。

  • 我认为规范很明确。“替换字符串..._其元素是 s_ 指向的元素的副本” - 这意味着***需要***以确保其具有此效果。没有先决条件提及重叠输入。因此,使用重叠输入调用它必须是安全的,因为实现***必须***具有所描述的效果 (10认同)
  • 对于“vector::push_back”等,有人认为省略任何要求都可以保证其表现良好(不允许失败)。libstdc++ 和 libc++ 似乎支持显式分配别名字符串。 (4认同)