std :: string size()是否为O(1)操作?
我正在使用的STL的实现是VC++内置的
如何从std :: string中删除第一个和最后一个字符,我已经在做以下代码了.
但是这段代码只删除了最后一个字符
m_VirtualHostName = m_VirtualHostName.erase(m_VirtualHostName.size() - 1)
Run Code Online (Sandbox Code Playgroud)
如何删除第一个字符?
考虑一个场景,std::string用于存储秘密.一旦它被消耗并且不再需要它,最好清理它,即覆盖包含它的内存,从而隐藏秘密.
std::string提供一个函数const char* data()返回指向(自C++ 11)连续内存的指针.
现在,由于内存是连续的,并且由于范围结束,变量将在清理后立即销毁,因此安全:
char* modifiable = const_cast<char*>(secretString.data());
OpenSSL_cleanse(modifiable, secretString.size());
Run Code Online (Sandbox Code Playgroud)
根据这里引用的标准:
$ 5.2.11/7 -注意:根据目的,通过指针,左值或指针以从得到的数据成员的写操作的类型
const_cast即擅自抛弃一个const-qualifier68可能会产生不确定的行为(7.1.5.1).
否则会提出建议,但是上面的条件(连续的,待去除的)是否安全?
是否有一个很好的简单的方法,以取代所有出现"/"在std::string与"\/"逃脱的所有斜线std::string?
我想建立std::string一个std::vector<std::string>.
我可以使用std::stringsteam,但想象有一个更短的方式:
std::string string_from_vector(const std::vector<std::string> &pieces) {
std::stringstream ss;
for(std::vector<std::string>::const_iterator itr = pieces.begin();
itr != pieces.end();
++itr) {
ss << *itr;
}
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
我怎么可能这样做?
由于存在一个错误,我刚刚发现该代码可以在Visual Studio 17以及其他编译器上正常编译。现在我很好奇为什么?
#include <iostream>
#include <string>
std::string foo(){
return nullptr;
}
int main(){
auto s = foo();
std::cout << s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我可以想象这是因为std::basic_string可以用a调用c'tor char*,同时返回从ptr到的隐式转换std::string(使用NULLas作为参数,然后变为poof)。我走对了吗?
C ++ 11给我们带来了UTF-8字面量的u8前缀,几年前我认为这很酷,并在代码中添加了以下内容:
std::string myString = u8"?";
Run Code Online (Sandbox Code Playgroud)
一切都很好,但是在C ++ 20中出现了问题,因为u8创建了char8_t *,并且与仅使用char的std :: string不兼容,因此似乎不再可以编译了。
我应该创建一个新的utf8string吗?在C ++ 20世界中,如果我们有更显式的类型与标准std :: string完全不匹配,那么一致的正确方法是什么?
可以在运行时创建C-Strings还是std::string必须创建constexpr它们?
使用gcc 4.9.2我可以这样做:
constexpr const char foo[] = "blee";
Run Code Online (Sandbox Code Playgroud)
(遗憾的是,2013年11月的客户技术预览版不允许Visual Studio支持此功能:https://stackoverflow.com/a/29255013/2642059)
但即使使用gcc 4.9.2我也不能这样做:
constexpr const std::string foo = "blee";
Run Code Online (Sandbox Code Playgroud)
我收到错误:
error: the type 'const string {aka const std::basic_string<char>}' of constexpr variable 'foo'
is not literal
constexpr const std::string foo = "blee";
^
note: 'std::basic_string<char>' is not literal because:
class basic_string
^
note: 'std::basic_string<char>' has a non-trivial destructor
Run Code Online (Sandbox Code Playgroud)
但我想更多地澄清为什么 a std::string不是文字.也就是说:为什么必须在运行时构造字符串?
正如所指出的,这个问题可以部分回答:是否可以在constexpr中使用std :: string?但它没有涉及为什么std::string不能成为问题核心的文字.
我相信,std::string从NULL char指针初始化是未定义的行为.所以,这里是构造函数的替代版本,其中mStdString是一个类型的成员变量std::string:
void MyClass::MyClass(const char *cstr) :
mStdString( cstr ? cstr : "")
{}
void MyClass::MyClass(const char *cstr) :
mStdString(cstr ? std::string(cstr) : std::string())
{}
void MyClass::MyClass(const char *cstr)
{
if (cstr) mStdString = cstr;
// else keep default-constructed mStdString
}
Run Code Online (Sandbox Code Playgroud)
编辑,构造函数声明里面class MyClass:
MyClass(const char *cstr = NULL);
Run Code Online (Sandbox Code Playgroud)
其中哪一个,或者可能是其他东西,是std::string从可能NULL指针初始化的最佳或最正确的方法,为什么?不同的C++标准有什么不同?假设正常发布构建优化标志.
我正在寻找一个答案,解释为什么一种方式是正确的方式,或一个带有参考链接的答案(这也适用于答案是"无关紧要"),而不仅仅是个人意见(但如果你必须,至少让它只是一个评论).
我有一个简单的问题.我想知道std::string每次在C++中是否分配内存.
在我的代码中,似乎构造函数将使用更多的内存来构造而tst_first_string不是tst_second_string:
char* first_string = new char[5];
strcpy(first_string, "test");
std::string tst_first_string(first_string);
std::string tst_second_string("test");
Run Code Online (Sandbox Code Playgroud)