2016-06-30 75 views
-4

我正试图解决这个问题:我如何摆脱C++循环?

编写一个程序来计算每个不同的单词出现在其输入中的次数。

这是迄今为止代码:

#include <algorithm> 
#include <iomanip> 
#include <ios> 
#include <iostream> 
#include <string> 
#include <vector> 
#include <iterator> 

using std::cin; 
using std::sort; 
using std::cout; 
using std::streamsize; 
using std::endl; 
using std::string; 
using std::setprecision; 
using std::vector; 

int main() 
{ 
    cout << "Enter words: "; 
    vector<string> lista; 
    vector<string> listaCitita; 
    string x; 
    while(cin >> x) 
    { 
     lista.push_back(x); 
    } 

int listaSize = lista.size(); 
for(int i = 0; i <= listaSize -1; i++) 
{ 
    int x = 0; 
    int counter = 0; 
    vector<string>::iterator it = find(listaCitita.begin(), listaCitita.end(), lista[i]); 
    vector<string>::iterator itu = find(lista.begin(), lista.end(), lista[i]); 
    if(it != listaCitita.end()) 
    { 
     break; 
    } 
    while(x <= listaSize -1) 
    { 


     if(lista[i] == lista[x]) 
     { 
      counter++; 
      x++; 
      if(itu != lista.end()) 
      { 
      } 
      else 
      { 
       listaCitita.push_back(lista[i]); 
      } 
     } 
     else 
     { 
      x++; 
     } 


    } 
    cout << "The string: '" << lista[i] << "' appeared " << counter << " times" << endl; 

} 

return 0; 


} 

我想要做的是,如果它已经被打印了多少次这个词表明,它不会是印刷再次多少次显示。 这就是为什么我做了第二个向量(listaCitita),我添加了已经迭代过的元素。问题是当我这样做时,它不会突破for循环。

if(it != listaCitita.end()) 
    { 
     break; 
    } 

对不起我的英语不好。谢谢。

+0

是什么让你觉得它不会打破循环?在if(it!= listaCitita.end())之前添加调试打印'cout <<(listaCitita.end()== it?“it = end”:“it!= end”)<< endl; '。添加'cout <<“它打破了!”在'break'之前,'endl';添加'cout <<“没有打破!”在'}之后的<< endl'。走着瞧吧。 – user31264

+0

做到了。它没有中断。 – furthergarden

+0

请发送输出摘录。 – user31264

回答

2

break语句结束最近出现的封闭循环或条件语句的执行。如果有的话,控制权传递给陈述结束后的陈述。

当你到达break,你会跳在for环(return 0)结束。你想在这里使用的是continue关键字,它会跳过当前单词并继续下一个单词。

0

如果你的程序达到了突破,它肯定会突破它。

另一种突破循环的方式,特别是如果它是一个嵌套循环,并且你想跳出一个外部循环,那么将会到达。

... 
while(...) { while(...) { if(...) { goto end; }}} 
end: //will jump here 
... 
0

你可以摆脱使用gotothrowreturn嵌套循环的(当然,你需要你的循环分成一个函数或拉姆达这后一种方法的工作)。

在任何情况下,您的特定任务都不会要求突破嵌套循环或任何其他循环。您需要检查单词是否已经打印在外部循环中。如果是,请继续,否则继续进行计数,打印并将其推送到已打印单词的矢量。

使用适合任务的容器和/或算法将消除完全使用嵌套循环的需要。考虑std::unordered_map。还读了约std::count