我只知道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?
为了提高性能,我尝试std::string用自定义专业化来替代,std::basic_string其中我用自定义分配器替换标准分配器。有一件事让我感到惊讶:std::stoi函数类需要不断引用std::string(或std::wstring) 作为输入,因此这些函数不能与其他专业化一起使用。但从逻辑上讲,这些函数不应该关心内存是如何分配的;所以他们的签名看起来过于限制。
虽然我可以使用std::from_chars从任何类似字符串的数据中读取整数,但我仍然想知道是否有这样设计的原因std::stoi,以及是否还有其他设计用于与std::basic_string模板一起使用的 STL 函数。
我有以下问题.我试图将我编写的大代码与Qt接口集成.
我的一些功能返回std::string.我没有成功QLineEdit::setText接受它们(返回的其他功能char不会给我带来麻烦).
我该怎么办?谢谢!
朱塞佩
我有一个类,它返回一个指向"const TCHAR"的类型指针.我需要将它转换为std :: string,但我还没有找到一种方法来实现这一点.
谁能提供一些有关如何转换它的见解?
我正在处理巨型(最多2GB)字符串及其在C++程序中的切片.在这种情况下,C风格的字符串似乎不可靠,但可以简单地切片(最后没有'\ 0').另一方面,据我所知,std :: string :: substr复制了切片,因此我应该为每个索引执行至少一个额外的加法运算(索引+基数),以保持内存使用的合理性.
对我的应用程序进行概要分析表明它在字符串分配中花费了近5%的CPU时间.在许多地方,我从64MB字符缓冲区制作C++ std :: string对象.问题是,缓冲区在程序运行期间永远不会改变.我对std::string(const char *buf,size_t buflen)调用的分析是正在复制字符串,因为缓冲区可能在字符串生成后发生变化.这不是问题所在.有没有解决这个问题的方法?
编辑:我正在使用二进制数据,所以我不能只是传递char *s.此外,由于总是扫描NULL,我会有很大的开销,这std::string避免了.
我试图比较两个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++ 11或C++ 14类型的STRING std: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) 有时您需要填充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大于我们在堆栈上想要的,我们基本上执行以下操作:
由于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() …
我写了函数。但老师告诉我,在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)