2017-06-01 40 views
0

我需要编写一个程序来打印文件中特定单词的行号(升序)。该方案的实施例输出将是:更有效的方法来查找矢量中的连续数字?

Hello 1, 3, 5-6, 8, 10-15. 
// 5-6 represents 5, 6 (consecutive numbers) 

的行号存储在排序vector<int>,没有重复。我创造了一个解决方案,但我的直觉告诉我我可以做得更好。我希望得到一些反馈。此外,以下代码仅处理行号。这个词在另一种方法中找到。

void IndexPager::createLines(vector<int>& vec, string& line) 
{ 
    int start = *vec.begin(), end = -1, offset = 0; // initial offset to start 

    for (vector<int>::const_iterator itr = vec.begin(); 
     itr != vec.end() + 1; itr++) 
    { 
    if (*itr == start + offset && itr != vec.end()) 
    { 
     end = *itr; 
     ++offset; 
    } // check if line numbers are consecutive and not reading at end of vector 
    else // not consecutive 
    { 
     if ((end != -1) && (end != start)) 
     { 
     line.append(intToString(start) + "-"); 
     line.append(intToString(end)); 
     } // if there existed consecutive numbers, display with dash 
     // must be difference of at least 1 
     else // else, there were no consecutive numbers 
     line.append(intToString(start)); 

     if (itr != vec.end()) // check if not at end of vector 
     line.append(", "); 
     else // reached end of vector 
     line.append("."); 

     start = *itr; // set start to next line number. Soft reset. 
     offset = 1; // change default offset to 1. 0 for first case. 
     end = -1; 
    } // not consecutive 
    } // Get all line numbers and format for proper output 
} // createLines() 
+2

如果你想对工作代码提供一些反馈,可以考虑将它发布在https://codereview.stackexchange.com/。但是,您将不得不包含完全可编译的解决方案;阅读帮助中心:https://codereview.stackexchange.com/help – user2296177

回答

0

几个意见。

    你假设向量长度
  1. > 0
  2. vec.end()+ 1可能不会给你希望,这取决于载体实现的结果。

在循环体的开始处增加itr而不是在最后使用来解决这两个问题。

效率,你可以尝试更换“启动+偏移”和“下一个”

void IndexPager::createLines(vector<int>& vec, string& line) 
{ 
    int start,end,next; 
    vector<int>::const_iterator itr = vec.begin(); 
    next=end=start=*itr; 
    while(itr!=vec.end()) 
    { 
     ++itr; 
     end=next++; 
     if(itr==vec.end()||next!=*itr) 
     { 
      // break in consecutive sequence 
      line.append(intToString(start)); 
      if(end!=start){ 
       line.append("-"); 
       line.append(intToString(end)); 
      } 
      if(itr!=vec.end()) 
      { 
       line.append(", "); 
      } 
      next=end=start=*itr; 
     } 
    } // Get all line numbers and format for proper output 
    line.append("."); 
} // createLines() 

ITR仍在核对vec.end()每次迭代三次,所以你可能要重复的突破-in-sequence部分,并且使用正常的(auto i:vec)代替,但是所述编译器优化可以消除重复