В строке первые символы (не более 6-ти) представляют собой цифры — некий ID, после него идет описание (любое количество всевозможных символов, но не цифр). Необходимо найти в контейнере, типа vector, элемент, у которого поле (допустим тоже ID) равняется ID из строки. Хотелось бы увидеть решение, основанное на алгоритмах STL (поменьше циклов). Заранее спасибо.
Здравствуйте, Аноним, Вы писали:
А>В строке первые символы (не более 6-ти) представляют собой цифры — некий ID, после него идет описание (любое количество всевозможных символов, но не цифр). Необходимо найти в контейнере, типа vector, элемент, у которого поле (допустим тоже ID) равняется ID из строки. Хотелось бы увидеть решение, основанное на алгоритмах STL (поменьше циклов). Заранее спасибо.
use std::find_if
Здравствуйте, Аноним, Вы писали:
А>В строке первые символы (не более 6-ти) представляют собой цифры — некий ID, после него идет описание (любое количество всевозможных символов, но не цифр). Необходимо найти в контейнере, типа vector, элемент, у которого поле (допустим тоже ID) равняется ID из строки. Хотелось бы увидеть решение, основанное на алгоритмах STL (поменьше циклов). Заранее спасибо.
struct id_match
{
id_match( std::string const & s )
: s_( s )
{}
bool operator()( std::string const & s )
{
return s.substr( 0, s_.size( ) ) == s_;
}
private:
std::string s_;
};
std::vector< std::string > v;
//....
std::string id = "123456";
std::string::iterator res = std::find_if( v.begin( ), v.end( ), id_match( id ) );
C бустом можно и так
std::vector< std::string > v;
//....
std::string id = "123456";
std::string::iterator res = std::find_if( v.begin( ), v.end( ),
boost::bind( &std::string::substr, _1, 0, id.size( ) ) == id );
Здравствуйте, <Аноним>, Вы писали:
А>В строке первые символы (не более 6-ти) представляют собой цифры — некий ID, после него идет описание (любое количество всевозможных символов, но не цифр). Необходимо найти в контейнере, типа vector, элемент, у которого поле (допустим тоже ID) равняется ID из строки. Хотелось бы увидеть решение, основанное на алгоритмах STL (поменьше циклов). Заранее спасибо.
inline int compare_ids(const std::string& s1, const std::string& s2)
{
return atoi(s1.c_str())-atoi(s2.c_str()); // самый халтурный способ; может быть, не самый быстрый, зато наглядный
}
struct less_ids : binary_function<const std::string&, const std::string&, bool> // для поиска в упорядоченных контейнерах
{
bool operator()(const std::string& s1, const std::string& s2) const { return compare_ids(s1,s2)<0; }
};
struct equal_ids : binary_function<const std::string&, const std::string&, bool> // для поиска в неупорядоченных
{
bool operator()(const std::string& s1, const std::string& s2) const { return compare_ids(s1,s2)==0; }
};
Здравствуйте, ArtDenis, Вы писали:
AD>Похоже на задание на собеседовании
Если это задание с собеседования, то отвечать надо так: «А почему ID записи не в отдельном поле, а в первых n символах строки? А массив сортированный? Нет? А почему? И вообще, почему vector, а не map и не hashmap?»
Здравствуйте, Аноним, Вы писали:
А>В строке первые символы (не более 6-ти) представляют собой цифры — некий ID, после него идет описание (любое количество всевозможных символов, но не цифр). Необходимо найти в контейнере, типа vector, элемент, у которого поле (допустим тоже ID) равняется ID из строки. Хотелось бы увидеть решение, основанное на алгоритмах STL (поменьше циклов). Заранее спасибо.
Что-то я плохо понимаю... У нас есть строка "11012xyzzy..." и std::vector<MyClass>, в котором лежат, в числе прочего, численные ID? Тогда x = atoi(str) и std::find_if(first, last, boost::bind(&MyClass::id, _1) == x).
P. S. Вряд ли в этом случае «меньше циклов» == «лучше».
Centaur пишет: > Если это задание с собеседования, то отвечать надо так: «А почему ID записи не в отдельном поле, а в первых n символах строки? А массив сортированный? Нет? А почему? И вообще, почему vector, а не map и не hashmap?»