我string::at在学校接受教育,但是通过探索我看到的字符串库string::operator[],我之前从未展示过.
我现在正在使用operator[]并且从未使用at过,但有什么区别?以下是一些示例代码:
std::string foo = "my redundant string has some text";
std::cout << foo[5];
std::cout << foo.at(5);
Run Code Online (Sandbox Code Playgroud)
它们在输出方面基本相同,但是有一些我不知道的细微差别吗?
首先从标准中摘录一些:
规格string::operator[]():
const_reference运算符[](size_type pos)const;
reference operator [](size_type pos);
需要:pos <= size().
返回:*(begin()+ pos)如果pos <size(),否则引用类型为T的对象,其值为charT(); 参考值不得修改.
复杂性:恒定时间.
规格string::c_str()和string::data():
const charT*c_str()const noexcept;
const charT*data()const noexcept;
返回:指针p,p + i == &operator[](i)对于[0,size()]中的每个i.
复杂性:恒定时间.
通过组合这两个规范,我们可以看到/ p返回的指针必须满足指定字符串的元素,并且等于,指定具有该值的对象.由于指针上的加法运算符用于获取字符串元素和最后一个对象的地址,因此它们必须位于单个数组中(您不能只使用字符串元素并在运行中创建对象,把它返还).那么可以肯定地说,在C++ 11中,保证在其底层存储中具有终止空字符吗?c_str()data()p[0...size()-1]p[size()]operator[](size())charT()charT()charT()str::string
编辑:我没有注意到我的问题的道歉是重复的.但是,我在这里得到的答案似乎与那个重复问题的答案相矛盾.
此外,我应该削弱我的假设:底层表示std::string应该保留足够的空间来保存终止空字符,并自由设置charT()值直到c_str()/ data()被调用.(即底层存储必须能够随时保留至少size()+1元素.)
我有一个std::string类的对象,我需要传递给C函数,char*通过迭代它并搜索空终止符号来操作缓冲区.
所以,我有这样的事情:
// C function
void foo(char* buf);
// C++ code
std::string str("str");
foo(&str[0]);
Run Code Online (Sandbox Code Playgroud)
假设我们使用C++ 11,因此我们保证std::string表示将具有连续存储的字符.
但我想知道是否有任何保证&str[0]会指向缓冲区结束\0?是的,有c_str成员函数,但我在谈论operator[].
有人可以引用标准吗?
这段代码是否根据C++标准定义良好?看起来有点哈哈.
#include <string>
char* GetPointer(std::string& s)
{
return &s[0];
}
Run Code Online (Sandbox Code Playgroud)
标准是否确保该代码返回指向存储字符的数组中第一个元素的指针?