标签: stdstring

我可以更改已分配给 std::string_view 的 std::string

我只知道C++17引入了std::string_view. 它不保存任何字符串,而是指向一个字符串。如果是这样,我对以下情况感到困惑:

std::string str = "abc";
std::string_view strV = str;
std::cout << strV << std::endl;
str = "1";
std::cout << strV << std::endl;
Run Code Online (Sandbox Code Playgroud)

我刚刚在网上的一些 c++17 编译器上尝试了这段代码,输出如下:

abc
1c
Run Code Online (Sandbox Code Playgroud)

显然,1c这不是我所期望的。

那么这是否意味着我们不应该更改分配给 a 的字符串std::string_view?

c++ stdstring string-view c++17

5
推荐指数
2
解决办法
596
查看次数

为什么 stoi 不允许 std::basic_string 作为输入?

为了提高性能,我尝试std::string用自定义专业化来替代,std::basic_string其中我用自定义分配器替换标准分配器。有一件事让我感到惊讶:std::stoi函数类需要不断引用std::string(或std::wstring) 作为输入,因此这些函数不能与其他专业化一起使用。但从逻辑上讲,这些函数不应该关心内存是如何分配的;所以他们的签名看起来过于限制。

虽然我可以使用std::from_chars从任何类似字符串的数据中读取整数,但我仍然想知道是否有这样设计的原因std::stoi,以及是否还有其他设计用于与std::basic_string模板一起使用的 STL 函数。

c++ stdstring stoi

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

如何在QLineEdit中使用std :: string?

我有以下问题.我试图将我编写的大代码与Qt接口集成.

我的一些功能返回std::string.我没有成功QLineEdit::setText接受它们(返回的其他功能char不会给我带来麻烦).

我该怎么办?谢谢!
朱塞佩

c++ qstring qt stdstring

4
推荐指数
1
解决办法
3917
查看次数

如何将"指向const TCHAR的指针"转换为"std :: string"?

我有一个类,它返回一个指向"const TCHAR"的类型指针.我需要将它转换为std :: string,但我还没有找到一种方法来实现这一点.

谁能提供一些有关如何转换它的见解?

c++ tchar stdstring

4
推荐指数
1
解决办法
5632
查看次数

如何以较少的开销管理字符串片?

我正在处理巨型(最多2GB)字符串及其在C++程序中的切片.在这种情况下,C风格的字符串似乎不可靠,但可以简单地切片(最后没有'\ 0').另一方面,据我所知,std :: string :: substr复制了切片,因此我应该为每个索引执行至少一个额外的加法运算(索引+基数),以保持内存使用的合理性.

c++ substring cstring stdstring slice

4
推荐指数
1
解决办法
744
查看次数

我可以从const char*数组中用C++进行零拷贝std :: string分配吗?

对我的应用程序进行概要分析表明它在字符串分配中花费了近5%的CPU时间.在许多地方,我从64MB字符缓冲区制作C++ std :: string对象.问题是,缓冲区在程序运行期间永远不会改变.我对std::string(const char *buf,size_t buflen)调用的分析是正在复制字符串,因为缓冲区可能在字符串生成后发生变化.这不是问题所在.有没有解决这个问题的方法?

编辑:我正在使用二进制数据,所以我不能只是传递char *s.此外,由于总是扫描NULL,我会有很大的开销,这std::string避免了.

c++ performance stdstring zero-copy

4
推荐指数
2
解决办法
3090
查看次数

有没有使用str.substr()来提取给定位置的子串的替代方法?

我试图比较两个std :: strings,并确定字符串A是否与字符串B相同,但是插入或删除单个字符.否则返回false.例如:"开始"和"strt"或"广告"和"添加"目前:

if(((sizeA - sizeB) != 1)
   && ((sizeB - sizeA) != 1))
{
    return false;
}

if(sizeA < sizeB)
{
    for(int i = 0; i < sizeA; ++i)
    {
        if(stringA[i] != stringB[i])
        {
            if(stringA.substr(i)
               == stringB.substr(i + 1))
            {
                return true;
            }
            else return false;
        }
    }
} //with another loop that runs only if stringA is larger than stringB
Run Code Online (Sandbox Code Playgroud)

这完美无瑕,但gprof告诉我这个功能正在陷入困境.我尝试转换for循环以使用迭代器来访问字符,但这使我的运行时间增加了一倍.我把它缩小到我对std :: string.substr()的使用,因为每次stringA和stringB的大小不同时,它都会构造新的字符串.

当第一个字符不同时,我需要一种更有效的方法来检查我是否要删除该字符,这两个字符串是否相等?

c++ string compare stdstring substr

4
推荐指数
1
解决办法
836
查看次数

具有最大长度的字符串类型

我需要实现一个类似于C++ 11或C++ 14类型的STRING std:string,但具有以下附加约束/功能:

  1. 声明期间指定的WIDTH参数.如果STRING的长度大于WIDTH,则STRING将抛出异常
  2. 声明期间指定的可选FIXED参数.如果STRING的长度不等于WIDTH,则STRING将抛出异常

在所有其他方面,STRING应该表现得像std::string并且公开相同的成员函数std:string(例如.append()etc ..).

我的第一直觉是使用一个STRING包含a 的模板类std::string,如下所示:

template<int WIDTH= 0, bool FIXED = false>
class STRING {
    static_assert(WIDTH >= 0, "WIDTH of STRING cannot be negative.");
public:
    STRING() : value{} { }

    STRING(const std::string &s) { if (is_valid(s)) value = s; }

    STRING(const char c[]) { if (is_valid(c)) value = c; }

    STRING& operator=(const std::string& s){ if (is_valid(s)) value = s;}
    operator std::string() const { return …
Run Code Online (Sandbox Code Playgroud)

c++ string stdstring c++11

4
推荐指数
1
解决办法
1093
查看次数

使用C函数来操作std :: string

有时您需要填充std::string由C函数构造的字符.一个典型的例子是这样的:

constexpr static BUFFERSIZE{256};
char buffer[BUFFERSIZE];
snprint (buffer, BUFFERSIZE, formatstring, value1, value2);
return std::string(buffer);
Run Code Online (Sandbox Code Playgroud)

注意我们首先需要填充本地缓冲区,然后将其复制到std::string.

如果计算最大缓冲区大小并且不一定要存储在堆栈上,则示例会变得更复杂.例如:

constexpr static BUFFERSIZE{256};
if (calculatedBufferSize>BUFFERSIZE)
   {
   auto ptr = std::make_unique<char[]>(calculatedBufferSize);
   snprint (ptr.get(), calculatedBufferSize, formatstring, value1, value2);
   return std::string(ptr.get());
   }
else
   {
   char buffer[BUFFERSIZE];
   snprint (buffer, BUFFERSIZE, formatstring, value1, value2);
   return std::string(buffer);
   }
Run Code Online (Sandbox Code Playgroud)

这使代码更加复杂,如果calculatedBufferSize大于我们在堆栈上想要的,我们基本上执行以下操作:

  • 分配内存(make_unique)
  • 用想要的结果填充内存
  • 分配内存(std :: string)
  • 将内存复制到字符串
  • 释放记忆

由于C++ 17 std::string有一个非const data()方法,暗示这是操纵字符串的方法.所以这似乎很有诱惑力:

std::string result;
result.resize(calculatedBufferSize);
snprint (result.data(), calculatedBufferSize, formatstring, value1, value2);
result.resize(strlen(result.c_str()));
return result;
Run Code Online (Sandbox Code Playgroud)

我的实验表明,需要进行最后一次调整以确保正确报告字符串的长度. std::string::length() …

c++ stdstring c++17

4
推荐指数
1
解决办法
108
查看次数

计算字符串中元音的函数

我写了函数。但老师告诉我,在3 个的参数的std::count_if功能,有必要通过拉姆达找出如果这封信是元音。

我不知道如何在那里转移它。

unsigned CalculateVowels(const std::string& str)
{
    const std::string& vowels = "aeiouAEIOU";
    unsigned count = std::count_if(str.begin(), str.end(), [](int index) {return str[index] == vowels[index]; })

    return count;
}
Run Code Online (Sandbox Code Playgroud)

c++ algorithm lambda stdstring c++11

4
推荐指数
1
解决办法
111
查看次数