标准是否保证string :: erase和string :: pop_back不重新分配内存?

for*_*ack 7 c++ string

是否标准保证string::erasestring::pop_backDO NOT重新分配内存?擦除一些元素后,是否string可能会自动缩小?

我检查了标准,它说,string::erase然后string::pop_back抛出std::out_of_range或扔掉任何东西.我可以将其作为这些方法进行任何重新分配的保证吗?由于重新分配可能会抛出bad_alloc.

Cad*_*hon 1

阅读文档,我认为这取决于函数的签名。在这种情况下,basic_string& erase(size_type pos = 0, size_type n = npos);它被描述为前一个字符串的副本。在这种情况下,iterator erase(const_iterator first, const_iterator last);元素被删除

事实上,我对这种差异感到非常惊讶。我认为你不能确定没有分配。

编辑请注意,在这个小示例中,我在每次检查时都保留相同的地址:

#include <iostream>
int main()
{
    std::string a;
    for(std::size_t i = 0; i < 10000; ++i)
        a += "Hello World ! My name is Bond... James Bond.";
    std::cout << (long)&a[0] << std::endl;
    a.erase(400000);
    std::cout << (long)&(a[0]) << std::endl;
    a.erase(10);
    std::cout << (long)&(a[0]) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)