C++11 关于std::basic_字符串的底层存储
在阅读了CPPFREFERENCE上关于C++11 关于std::basic_字符串的底层存储,c++11,memory,stdstring,C++11,Memory,Stdstring,在阅读了CPPFREFERENCE上关于std::basic_string的描述之后,我不确定关于std::basic_string的底层存储的以下两个问题: 1) 自C++11以来,std::basic_string的连续性是否扩展到终止的空字符?请注意,str[str.size()]返回对终止空字符的引用。但是我想确定这是否是在str[str.size()-1]之后 2) 自从C++11以来,data()和C_str()变得等价。但它是否认为data()==c_str()==&front()
std::basic_string
的描述之后,我不确定关于std::basic_string
的底层存储的以下两个问题:
1) 自C++11以来,std::basic_string
的连续性是否扩展到终止的空字符?请注意,str[str.size()]
返回对终止空字符的引用。但是我想确定这是否是在str[str.size()-1]
之后
2) 自从C++11以来,data()
和C_str()
变得等价。但它是否认为data()==c_str()==&front()
本标准的任何报价都将不胜感激
21.4.1.7basic\u string
accessors
const charT*c_str()const noexcept代码>
const charT*data()const noexcept代码>
1返回:指针p
,这样p+i==&运算符[](i)
对于[0,size()]
中的每个i
2复杂性:恒定时间
这有效地要求终止的NUL
与字符序列一起连续存储(它强制操作符[]
附加要求s[s.size()]
不要做任何花哨的事情,尽管21.4.5的纯文本似乎给了它一些自由度)
它还明确要求s.c_str()==&s[0]
,这反过来意味着s.c_str()===&s.front()
(front()
被定义为操作符[](0)
)。是和是,都是。是,是。一直困扰我的是[0,s.size())中任意n的&*(s.begin()+n)==&*s.begin()+n
。但这是迭代器的一个缺陷(s.begin()+s.size()
是一个特殊的结束迭代器,可以做一些奇特的事情),而不是连续性:)