0

我正在尝试检查一行是否正好有 10 个单词。我这样做的方式是复制该行,并逐个提取并增加计数器,如果它是10,我操纵该行。但我觉得这非常低效,因为我必须对每一行都这样做,而且大多数行都是 10 个单词。所以我正在寻找一种更有效的方法来做到这一点。

    while(getline(ifs, line)){
        istringstream iss (line);
        int s_counter = 0;
        istringstream iss_copy = iss;   //create a copy to test if there are 10 strings in a iss
        string s;
        while (iss_copy >> s){
            ++s_counter;
        }
        if (s_counter == 10){
            while(iss>>word){   
                ...//manipuate each word                
            }
        }
    }
4

2 回答 2

0

我是这样做的:

int main()
{
  std::string s1("hi hi hi hi //blah");
  size_t pos = s1.find('/');  
  std::cout << std::count(s1.begin(), s1.begin()+pos, ' ') << std::endl;
  return 0;
}

或者

int countSpace(const std::string& s)
{
  int count = 0;

   for(size_t i=0; i<s.size()-1; i++)
   {
     if (s[i] == ' ')
     {
       count++;
     }
     if (s[i+1] == '/')
     {
       return count;
     }
   }
   return count;
}


int main()
{
  std::string s1("hi hi hi hi //blah");
  countSpace(s1);
  return 0;
}  
于 2013-02-25T00:24:05.710 回答
0

您可以更有效地使用 STL 算法。

template<typename charT>
struct CntSpaceFunctor {
    bool isEnd ;
    std::size_t value ;
    CntSpaceFunctor( ) : isEnd(false),value(0) {} 

    inline void operator()( charT ch ) const {
         if( ch == charT(' ') && !isEnd)  ++value ;
         else if( ch == charT('/') )      isEnd = true ;
         else ;
    }
};
int countSpace( const string& str ) {
    CntSpaceFunctor<char> result ;
    return for_each( str.begin() , str.end() , result ).value ;
}
于 2013-02-25T01:45:02.993 回答