任何更快的方法来计算字符串流中的字符串数量

时间:2013-02-24 23:34:52

标签: c++ string counter

我正在尝试检查一行是否只有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                
            }
        }
    }

2 个答案:

答案 0 :(得分: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;
}

OR

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;
}  

答案 1 :(得分: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 ;
}