поиск в контейнере
От: Аноним  
Дата: 17.07.06 10:24
Оценка:
В строке первые символы (не более 6-ти) представляют собой цифры — некий ID, после него идет описание (любое количество всевозможных символов, но не цифр). Необходимо найти в контейнере, типа vector, элемент, у которого поле (допустим тоже ID) равняется ID из строки. Хотелось бы увидеть решение, основанное на алгоритмах STL (поменьше циклов). Заранее спасибо.
Re: поиск в контейнере
От: LuciferMoscow Россия  
Дата: 17.07.06 10:26
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>В строке первые символы (не более 6-ти) представляют собой цифры — некий ID, после него идет описание (любое количество всевозможных символов, но не цифр). Необходимо найти в контейнере, типа vector, элемент, у которого поле (допустим тоже ID) равняется ID из строки. Хотелось бы увидеть решение, основанное на алгоритмах STL (поменьше циклов). Заранее спасибо.

use std::find_if
Re: поиск в контейнере
От: ArtDenis Россия  
Дата: 17.07.06 10:38
Оценка:
Похоже на задание на собеседовании
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: поиск в контейнере
От: Аноним  
Дата: 17.07.06 11:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В строке первые символы (не более 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 );
Re: поиск в контейнере
От: Кодт Россия  
Дата: 17.07.06 11:11
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>В строке первые символы (не более 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; }
};
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Перекуём баги на фичи!
Re[2]: поиск в контейнере
От: Centaur Россия  
Дата: 17.07.06 17:06
Оценка: :)
Здравствуйте, ArtDenis, Вы писали:

AD>Похоже на задание на собеседовании


Если это задание с собеседования, то отвечать надо так: «А почему ID записи не в отдельном поле, а в первых n символах строки? А массив сортированный? Нет? А почему? И вообще, почему vector, а не map и не hashmap?»
Re: поиск в контейнере
От: Roman Odaisky Украина  
Дата: 17.07.06 19:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В строке первые символы (не более 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. Вряд ли в этом случае «меньше циклов» == «лучше».
До последнего не верил в пирамиду Лебедева.
Re[3]: поиск в контейнере
От: ArtDenis Россия  
Дата: 18.07.06 05:57
Оценка:
Centaur пишет:
> Если это задание с собеседования, то отвечать надо так: «А почему ID записи не в отдельном поле, а в первых n символах строки? А массив сортированный? Нет? А почему? И вообще, почему vector, а не map и не hashmap?»

В точку
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.