0

行に正確に10語が含まれているかどうかを確認しようとしています。私がやった方法は、行のコピーを作成し、1つずつ抽出してカウンターをインクリメントすることです。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 に答える