在 std::string 中每隔一定数量的字母添加一个换行符
Add a newline every set amount of letters in std::string
我在 C++ 程序中处理一些长字符串(最多 65535 个字母)。
我正在寻找的是一种使用如下函数在每个设定数量的字母中添加一个新行的方法:
addNewLinesToString(std::string* string, u8 lettersBetween newline);
这会像这样工作:
string test = "Testing1234567";
addNewLinesToString(&test, 7); //test == "Testing\n1234567\n"
我还没有找到这样一个只使用标准class库(C and/or C++)的函数
如果有人对此有一个简单的解决方案,那就太好了:)
谢谢
您可以使用 string::insert
来达到这个目的。
addNewLinesToString(std::string& str, int sep)
{
for (int i = 0; i < str.size(); i += sep)
str.insert(i, "\n");
}
但这将是 O(n^2)(正如@stefan 所指出的),您也可以
addNewLinesToString(std::string& str, int sep)
{
string ans;
int i = 0;
while (i < str.size())
{
if (i % sep == 0 && i)
ans.push_back('\n');
ans.push_back(str[i]);
i++;
}
return ans;
}
哪个使用更多的内存但是是 O(n)。
看例子:http://www.cplusplus.com/reference/string/string/insert/
试试这个功能:
void addNewLinesToString(std::string* s, int change){
if(change <= 0)
return;
for(int i = 0; i < s.size(); i += change){
s.insert(i, "\n");
i++;
}
}
编辑:我不知道为什么你的 post 被否决了,我投了赞成票。
也许不是最快的,但工作:
void addNewLinesToString (std::string* txt, int limit)
{
if(limit <= 0)
return;
limit++;
for (int i=1; i<=txt->size()/limit; i++)
txt->insert((i*limit)-1, "\n");
}
std::string insert_newlines(const std::string &in, const size_t every_n)
{
std::string out;
out.reserve(in.size() + in.size() / every_n);
for(std::string::size_type i = 0; i < in.size(); i++) {
if (!(i % every_n) && i) {
out.push_back('\n');
}
out.push_back(in[i]);
}
return out;
}
这个:
- 只分配一次内存。
- 不会在需要
size_t
或 std::string::size_type
的地方使用 int
的错误,因此您不会 运行 陷入大字符串或嵌入式平台。
- 运行 线性
O(n)
时间。
- 有一个功能接口(而不是就地修改字符串),修改输入字符串和
O(n)
时间 运行s 的算法会复杂得多。
我在 C++ 程序中处理一些长字符串(最多 65535 个字母)。 我正在寻找的是一种使用如下函数在每个设定数量的字母中添加一个新行的方法:
addNewLinesToString(std::string* string, u8 lettersBetween newline);
这会像这样工作:
string test = "Testing1234567";
addNewLinesToString(&test, 7); //test == "Testing\n1234567\n"
我还没有找到这样一个只使用标准class库(C and/or C++)的函数
如果有人对此有一个简单的解决方案,那就太好了:) 谢谢
您可以使用 string::insert
来达到这个目的。
addNewLinesToString(std::string& str, int sep)
{
for (int i = 0; i < str.size(); i += sep)
str.insert(i, "\n");
}
但这将是 O(n^2)(正如@stefan 所指出的),您也可以
addNewLinesToString(std::string& str, int sep)
{
string ans;
int i = 0;
while (i < str.size())
{
if (i % sep == 0 && i)
ans.push_back('\n');
ans.push_back(str[i]);
i++;
}
return ans;
}
哪个使用更多的内存但是是 O(n)。
看例子:http://www.cplusplus.com/reference/string/string/insert/
试试这个功能:
void addNewLinesToString(std::string* s, int change){
if(change <= 0)
return;
for(int i = 0; i < s.size(); i += change){
s.insert(i, "\n");
i++;
}
}
编辑:我不知道为什么你的 post 被否决了,我投了赞成票。
也许不是最快的,但工作:
void addNewLinesToString (std::string* txt, int limit)
{
if(limit <= 0)
return;
limit++;
for (int i=1; i<=txt->size()/limit; i++)
txt->insert((i*limit)-1, "\n");
}
std::string insert_newlines(const std::string &in, const size_t every_n)
{
std::string out;
out.reserve(in.size() + in.size() / every_n);
for(std::string::size_type i = 0; i < in.size(); i++) {
if (!(i % every_n) && i) {
out.push_back('\n');
}
out.push_back(in[i]);
}
return out;
}
这个:
- 只分配一次内存。
- 不会在需要
size_t
或std::string::size_type
的地方使用int
的错误,因此您不会 运行 陷入大字符串或嵌入式平台。 - 运行 线性
O(n)
时间。 - 有一个功能接口(而不是就地修改字符串),修改输入字符串和
O(n)
时间 运行s 的算法会复杂得多。