C++ 将字符数组快速拆分为块c++;
除了在整个数组上循环外,还有没有更快/更有效的方法将字符数组拆分为块(比如21个字符/数组) 这是我现在的尝试C++ 将字符数组快速拆分为块c++;,c++,arrays,C++,Arrays,除了在整个数组上循环外,还有没有更快/更有效的方法将字符数组拆分为块(比如21个字符/数组) 这是我现在的尝试 const char* arr = line.c_str(); char smallArr[(int)ceil((double)strlen(arr)/(double)21)][21]; int arrSisze[(int)ceil((double)strlen(arr)/(double)21)][1]; int m=0;int n=0; for (int i=0; i<strl
const char* arr = line.c_str();
char smallArr[(int)ceil((double)strlen(arr)/(double)21)][21];
int arrSisze[(int)ceil((double)strlen(arr)/(double)21)][1];
int m=0;int n=0;
for (int i=0; i<strlen(arr); i++) {
smallArr[m][i]=arr[i];
arrSisze[m][0]=(i+1)-n;
if ((i-n)==19) {
m++;
n+=20;
}
}
const char*arr=line.c_str();
char smallArr[(int)ceil((double)strlen(arr)/(double)21)][21];
国际货币基金组织[(国际)货币基金组织((双)strlen(arr)/(双)21)][1];
int m=0;int n=0;
对于(int i=0;i < p>是,指针算术和<代码> MeMCPY < /C>。但是,当您使用C++时,让我们坚持<代码> STD::String < /Calp>S,假设他们为我们做了<代码> MeMCPy < /代码>。
std::vector<std::string> output;
output.reserve(line.length() / 21 + (line.length() % 21) ? 1 : 0);
auto i = line.begin(), j = i + 21;
for(; line.end() - j > 21; i = j, j+= 21)
{
output.emplace(i, j)
}
if(j != line.end())
{
output.emplace(j, line.end());
}
std::矢量输出;
output.reserve(line.length()/21+(line.length()%21)?1:0;
自动i=line.begin(),j=i+21;
对于(;line.end()-j>21;i=j,j+=21)
{
输出位置(i,j)
}
如果(j!=line.end())
{
emplace(j,line.end());
}
那么,这里发生了什么?就我们的目的而言,将std::string
看作char
数组和length
变量就足够了
首先,我们为输出预留了足够的空间。您也这样做了
接下来,我们定义两个变量i
,j
,i
表示当前子字符串的开始,而j
表示经过结束迭代器的子字符串。这里的迭代器可以看作是字符串字符数组内部结构的指针-它们甚至可能是字符*
s!
然后,我们一次迭代一行原始字符串。emplace
只是在正确的位置构造一个向量的新元素。调用相当于输出。push_back(std::string(i,j))
仅在C++11中可用
最后,我们使用line.end()-j>21
;line.end()
是通过char
数组的end迭代器的值-它指向NUL
字符(如果有)。如果没有整个块,我们使用j!=line.end()检查部分块
1)使用memcpy
char myname[] = "hello";
char dest[20] = {0};
/* using memcpy to copy string: */
memcpy ( dest, myname, 5);
char str1[]= "To be or not to be";
char str2[40];
strncpy ( str2, str1, sizeof(str2) );
2)使用strncpy
char myname[] = "hello";
char dest[20] = {0};
/* using memcpy to copy string: */
memcpy ( dest, myname, 5);
char str1[]= "To be or not to be";
char str2[40];
strncpy ( str2, str1, sizeof(str2) );
不要重新优化标准库
- 如果您有一个std::字符串,就使用它
- 不要在整数计算中使用浮点:只需使用整型算术运算即可
- 问题的复杂性为O(1)。任何其他解决方案都不会用少于一个字符串的遍历跨度和相关副本来覆盖它
正确使用C++,<强>忘记c
=
std::向量块;
调整块大小(21);
size\u t chunksize=line.size()/21+1;
对于(size_t i=0,j=0;iWhydouble
甚至涉及到任何问题?这表明一些非常低质量的代码。更不用说对strlen()
…的dupe调用了。不,数组操作不可能比O(n)更好
,您必须遍历数组。此外,您忘记了NUL终止子字符串。不要重新发明轮子,使用标准库,而不是滚动您自己的strcpy()
@H2CO3虽然我同意这可能是一个错误,但记录字符串的大小可能表明他不需要以NUL结尾的字符串。他可能不熟悉迭代器-您可能想解释一下这里发生了什么。-1您所有的大操作系统都关闭了;它应该显示,例如,“std::string::size
是O(1),而strlen
是O(N),其中,N
是字符串本身的长度。此外,您的算法没有达到OP要求的长度。Duh!我的意思是N^0、N^1等。但我没有找到表示它的方法。大O只是一个偶然的相似符号。混淆我最好正确地更改它……关于算法:请求是“将一行拆分为更小的块”。它不一定与OP尝试相同。