Что такое контейнер C++ с операцией "contains"?
Я хочу использовать структуру, в которую я вставляю целые числа, а затем могу спросить
if (container.contains(3)) { /**/ }
там должно быть что-то вроде этого.
5 ответов
можно использовать std::vector
.
std::vector<int> myVec;
myVec.push_back(3);
if (std::find(myVec.begin(), myVec.end(), 3) != myVec.end())
{
// do your stuff
}
вы даже можете сделать небольшую вспомогательную функцию:
template <class T>
bool contains(const std::vector<T> &vec, const T &value)
{
return std::find(vec.begin(), vec.end(), value) != vec.end();
}
как использовать:
if (contains(myVec, 3)) { /*...*/ }
простой алгоритм:
template <typename Container>
bool contains(Container const& c, typename Container::const_reference v) {
return std::find(c.begin(), c.end(), v) != c.end();
}
вы можете настроить его для более эффективного поиска по некоторым известным контейнерам:
template <typename Key, typename Cmp, typename Alloc>
bool contains(std::set<Key,Cmp,Alloc> const& s, Key const& k) {
return s.find(k) != s.end();
}
template <typename Key, typename Value, typename Cmp, typename Alloc>
bool contains(std::map<Key,Value,Cmp,Alloc> const& m, Key const& k) {
return m.find(k) != m.end();
}
и таким образом вы получаете единый алгоритм, который выполняет поиск по любому типу контейнера и является специальным, чтобы быть быстрее на тех контейнерах, которые заказаны.
find
на несортированном векторе O (n).
std::set
поддерживает o (log n) вставки и поиск и является хорошим выбором.
std::tr1::unordered_set
обеспечивает аналогичный интерфейс, но поддерживает почти постоянное время поиска. Это лучший выбор, если у вас есть TR1 (или C++0x) и вам не нужно перечислять элементы по порядку.
Что вы хотите-это метод find_first_of из библиотеки алгоритмов. (или двоичный поиск, или что-нибудь в этом роде)
Если вы хотите использовать стандартный контейнер C++, из-за его дизайна сами контейнеры не обязательно имеют "contains", но вы всегда можете использовать алгоритм поиска.
вы должны выбрать свой контейнер в соответствии с характеристиками вашего набора данных и доступом "рабочая нагрузка".
для хорошей ссылки на контейнеры и алгоритмы в стандартной библиотеке C++ проверьте http://www.cplusplus.com
Если, как кажется, ваши данные состоят из уникальных элементов, для которых вы хотите связать значение, вы, вероятно, будете хорошо обслуживаться контейнером карты. Если все, что вас волнует, это "членство", то set-лучший выбор.