Форум программистов, компьютерный форум CyberForum.ru

Как проверить содержит ли вектор элемент? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 91, средняя оценка - 4.93
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
28.02.2011, 15:56     Как проверить содержит ли вектор элемент? #1
Есть заполненный вектор:
C++
1
std::vector<std::string> us;
Как наиболее быстро определить, есть ли в нём определенный элемент?
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2011, 15:56     Как проверить содержит ли вектор элемент?
Посмотрите здесь:

C++ Проверить,содержит ли файл строку заданной длины.
Проверить содержит ли массив простые числа C++
Вектор. Проверить, упорядочены ли элементы C++
C++ Дано натурально n-значное число. Проверить содержит ли оно две одинаковые цифры. Оформить в виде функции
Строка содержит произвольный русский текст. Проверить, каких букв в нем больше, гласных или согласных C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
28.02.2011, 17:17     Как проверить содержит ли вектор элемент? #2
Если данные упорядочены - бинарный поиск, иначе - линейный.
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
28.02.2011, 19:03  [ТС]     Как проверить содержит ли вектор элемент? #3
Вот написал для вектора int'ов, но не работает

C++
1
2
3
4
5
6
7
8
9
10
11
std::vector<int> vector1;
std::vector<int>::iterator it = vector1.begin();
 
while(it != vector1.end()) {
     if (vector1.it == 102) {
            printf("Вектор содержет 102");
            break;
     }
     it++;
}
if(it == vector1.end()) printf("Вектор не содержет 102");
Подправьте синтаксис пожалуйста на строке 5
И это, я так понимаю, будет самый быстрый поиск для обыкновенного вектора?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
28.02.2011, 19:06     Как проверить содержит ли вектор элемент? #4
Damaks, Если уже юзаете вектора, то будет логично использовать и конкретные алгоритмы(STL). Для вашего случая:
Цитата Сообщение от silent_1991 Посмотреть сообщение
бинарный поиск
http://www.cppreference.com/wiki/ru/.../binary_search
Цитата Сообщение от silent_1991 Посмотреть сообщение
линейный
http://www.cppreference.com/wiki/ru/algorithm/search
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
28.02.2011, 19:30     Как проверить содержит ли вектор элемент? #5
Цитата Сообщение от Damaks Посмотреть сообщение
Вот написал для вектора int'ов, но не работает
C++
1
std::cout << ( std::find(vector1.begin(), vector1.end(), 13) == vector1.end() ? "нету " : "есть " ) << 13 << " в массиве." << std::endl;
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
28.02.2011, 19:34  [ТС]     Как проверить содержит ли вектор элемент? #6
find, это который в algorithm? У меня он работает недопустимо медленно. Сейчас попробуй совет asics.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.02.2011, 20:48     Как проверить содержит ли вектор элемент? #7
Damaks, find не может работать недопустимо медленно. Скорость зависит от кол-ва элементов в нем.
std::search для одного элемента не покатит.
Если find слишком медленно - либо пересмотрите используемый контейнер, либо binary_search после сортировки.
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
01.03.2011, 23:35     Как проверить содержит ли вектор элемент? #8
Насколько я знаю
find - ищет определенное значение и возвращает итератор
binary_search - ищет диапазон значений по отсортированному вектору и возвращает bool значение (есть/нету)
search - ищет диапазон значений по вектору и возвращает bool значение.
По скорости получается сначала binary_search, потом find, потом search, но для поиска одного числа быстрее find, я прав?
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
01.03.2011, 23:40     Как проверить содержит ли вектор элемент? #9
Цитата Сообщение от Union Посмотреть сообщение
Видимо find работает только со строками, а search с числами
Да нет, должно работать без проблем, пробуй так
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <vector>
#include <algorithm>
 
int main(){
  std::vector<int> a = {7, 3, 8, 6};
  std::cout << *std::find(a.begin(), a.end(), 3);
  return 0;
}
(Если у тебя не GCC4.5+ или MSVS10, заполни вектор по-другому)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 00:06     Как проверить содержит ли вектор элемент?
Еще ссылки по теме:

C++ Проверить, упорядочены ли элементы, заменить первый нулевой элемент и удалить указанный элемент из массива
Проверить, содержит ли заданный неориентированный граф хотя бы один цикл C++
Как в switch проверить элемент строки? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Union
 Аватар для Union
17 / 17 / 2
Регистрация: 16.08.2010
Сообщений: 252
02.03.2011, 00:06     Как проверить содержит ли вектор элемент? #10
Да, уже понял что ошибся
А про скорость ничего не скажете, что лучше для поиска по вектору int'ов?
Я вот сейчас замерил скорость find, а в search походу если одно число искать, а не диапазон, то мне надо задать его дважды, т.к. там можно задать только диапазон, правильно я мыслю? Или search предназначен только для поиска диапазона, и для поиска определенного числа его использовать неправильно?

Добавлено через 20 минут
Попробовал задать начальное и конечное значение одним числом, не вышло. Оказалось что разница между binary_search и search больше чем возможность поиска по несортированному вектору. binary_search ищет определенное число (у меня получилось его запустить), в то время как search диапазон, который нельзя задать одним числом, или у меня просто не получилось
Yandex
Объявления
02.03.2011, 00:06     Как проверить содержит ли вектор элемент?
Ответ Создать тему
Опции темы

Текущее время: 04:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru