2009-10-05 4 views
2

Хорошо, я делаю это, и все работает отлично.C++ векторы - Использование find (начало, конец, термин)

end = std::find(arToken.begin() + nStart, arToken.end(), "."); 

Я хочу расширить. включать ! а также ? поэтому он находит периоды (.), восклицательный знак (!) и знак вопроса (?).

Должен ли я использовать регулярное выражение в терминах?

ТИА

ответ

14

вы должны использовать std::find_first_of:

std::string m(".!?"); 
end = std::find_first_of(arToken.begin() + nStart, arToken.end(), m.begin(),m.end()); 
2

использовать предикат и std::find_if как это:

struct has_char { 
    has_char(const char *s) : str(s) {} 
    bool operator() (const char ch) const { 
     return str.find(ch) != std::string::npos; 
    } 
private: 
    std::string str; 
}; 

end = std::find_if(arToken.begin() + nStart, arToken.end(), has_char(".!?")); 
+0

Можете ли вы написать, что это была бесплатная функция, так что я мог понять немного легче. Спасибо – Jeremiah

+0

, поскольку вы используете std :: string, вы можете придерживаться методов, которые предоставляет класс. То есть в вашем методе operator() вы можете «вернуть s.find (ch)! = npos;» – Tim

+0

также, чтобы быть строгим, has_char должен наследовать от public std :: unary_function - для чего потребуется #include Tim

3

Вы можете использовать this. std::find_first_of

end=arToken.find_first_of(".!?",nStart); 
+1

Не должно быть std :: find_first_of? – Steve314

+0

Да, это так. :). Благодаря! Отредактировал мой ответ. – vpram86