for 循环不遍历整个数组
For loop not iterating through whole array
所以我对C++还是很陌生的,我创建了这个循环来浏览我在.csv文件中的一长串推文,我将其导入到一个包含 30,000 条的数组中。现在,HashAll函数用于查看每条推文并找到#的位置,然后将单词复制到新字符串中,然后将该新字符串放入新数组中以收集使用的主题标签。问题是,每次我测试我的代码时,我都会得到一个核心转储,我无法弄清楚为什么。这是我下面的代码。感谢您的任何帮助!
void AllTweets::HashAll(){
int counter=0;
for(int i=0; i<30000;i++){ //loop to looks are every tweet indv.
string singleTweet = Tweet[i];
int x = singleTweet.length();
for(int j=0;j<x;j++){
string newHash;
if(singleTweet[j]=='#') {
int k=j;
while(singleTweet[k]!=' '){
newHash=newHash+singleTweet[k];
k=k+1;
}
HashtagAll[counter]=newHash;
counter=counter+1;
}
}
}
看起来问题是你总是希望在标签单词后找到一个空格,并且在while()
循环中搜索它时,你永远不会测试你是否没有推断字符串的大小。
一个简单的解决方案是将该测试包含在循环中:
while (singleTweet[k] != ' ' && k < x)
{
newHash = newHash + singleTweet[k];
k++;
}
然而,我敦促应该重新考虑这个代码,这里发生的事情比眼睛看到的要多。每次将newHash
增加 1 个字符时,您都会强制它重新定位到内存中可以适应其新大小的新空间,从而产生不必要的、耗时的工作,并使内存碎片化,更不用说这不是如何处理C++中的字符串。
类std::string
不仅仅是一个自调整大小的缓冲区,它还提供了多种方法来处理文本和字符串,这些方法使您的代码客观且您的生活更轻松,您应该使用它们。例如,可以将您的方法重写为更像这样:
void AllTweets::HashAll()
{
size_t counter = 0;
for (size_t i = 0; i < 30000; ++i)
{
size_t find = 0;
while ((find = Tweet[i].find("#", find)) != std::string::npos)
{
size_t end = Tweet[i].find(" ", find + 1);
if (end == std::string::npos)
{
HashtagAll[counter++] = Tweet[i].substr(find);
break;
}
HashtagAll[counter++] = Tweet[i].substr(find, end - find);
find = end + 1;
}
}
}
此代码利用了旨在处理此问题的std::string
方法,同时避免了冗余工作、无意义的对象复制和内存碎片。
相关文章:
- 遍历并行数组以确定C++中的最大数字
- 遍历二维数组的所有子数组
- 遍历向量与数组哪个更快?
- 是否可以遍历传递给函数的数组?
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 数组数据以错误的方式遍历 Python/Matlab
- 如何使用 PHPCPP 传递对象数组,遍历每个对象并返回关联数组
- 如何使用指针遍历结构数组中的数组
- 程序在遍历所有值之前离开循环. 数组的
- 按顺序遍历 AVL 树,将值保存在数组中
- 数组 - 循环遍历辅助阵列
- 在C++中循环遍历二维数组时改进 O(n)
- 如何修复我的代码并使其遍历 2D 数组中的所有行?(C++)
- 如何遍历充满结构的数组
- 数组 通过指针遍历
- 在常量数组上使用指针遍历
- 如何遍历可变参数模板以填充 POD 数组
- 有条件的大平面数组遍历和令人惊讶的短循环执行时间
- 数组遍历中的BST