标签: stdstring

std :: string size()是否为O(1)操作?

std :: string size()是否为O(1)操作?

我正在使用的STL的实现是VC++内置的

c++ stl stdstring visual-c++

26
推荐指数
5
解决办法
1万
查看次数

删除第一个和最后一个字符C++

如何从std :: string中删除第一个和最后一个字符,我已经在做以下代码了.

但是这段代码只删除了最后一个字符

m_VirtualHostName = m_VirtualHostName.erase(m_VirtualHostName.size() - 1)
Run Code Online (Sandbox Code Playgroud)

如何删除第一个字符?

c++ string stdstring erase-remove-idiom

26
推荐指数
2
解决办法
7万
查看次数

如何清理(用随机字节覆盖)std :: string内部缓冲区?

考虑一个场景,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).

否则会提出建议,但是上面的条件(连续的,待去除的)是否安全?

c++ stdstring c++11

25
推荐指数
4
解决办法
2009
查看次数

如何使用std :: string替换所有出现的两个字符的一个字符?

是否有一个很好的简单的方法,以取代所有出现"/"std::string"\/"逃脱的所有斜线std::string

c++ replace escaping stdstring

24
推荐指数
2
解决办法
3万
查看次数

如何从std :: vector <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)

我怎么可能这样做?

c++ stl string-concatenation stringstream stdstring

24
推荐指数
5
解决办法
4万
查看次数

为什么将nullptr返回为std :: string时不是编译时错误?

由于存在一个错误,我刚刚发现该代码可以在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++ function stdstring language-lawyer

24
推荐指数
2
解决办法
1716
查看次数

具有u8,char8_t和std :: string的C ++ 20

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++ stdstring c++20

24
推荐指数
3
解决办法
1238
查看次数

为什么必须在运行时构造字符串?

可以在运行时创建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不能成为问题核心的文字.

c++ literals stdstring constexpr c++11

23
推荐指数
2
解决办法
2092
查看次数

从可能的NULL char指针初始化std :: string

我相信,std::stringNULL 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++标准有什么不同?假设正常发布构建优化标志.

我正在寻找一个答案,解释为什么一种方式是正确的方式,或一个带有参考链接的答案(这也适用于答案是"无关紧要"),而不仅仅是个人意见(但如果你必须,至少让它只是一个评论).

c++ null stdstring

22
推荐指数
2
解决办法
2万
查看次数

std :: string总是需要堆内存吗?

我有一个简单的问题.我想知道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)

c++ memory stdstring

22
推荐指数
2
解决办法
5530
查看次数