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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 91, средняя оценка - 4.93
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
#1

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

28.02.2011, 15:56. Просмотров 13585. Ответов 9
Метки нет (Все метки)

Есть заполненный вектор:
C++
1
std::vector<std::string> us;
Как наиболее быстро определить, есть ли в нём определенный элемент?
Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2011, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как проверить содержит ли вектор элемент? (C++):

Как редактировать поля структуры и как добавить новый элемент в вектор структур? - C++
Отзовитесь, пожалуйста, кто-то. Допустим есть структура struct worker { int exp; const char* name; const...

Вектор из матриц C++, как добавить новый элемент вектора? - C++
У меня такая запись, вектор из матриц vector&lt;int&gt; v(10); Допустим мне надо в конец вектора вставить еще одну матрицу. Как это...

Как в switch проверить элемент строки? - C++
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Я попытался проверить элемент строки в switch. В смысле switch (s). Но...

Вектор. Если он является перестановкой, то есть содержит все числа от 1 до N, то вывести 0 - C++
Дан целочисленный контейнер vector. Если он является перестановкой, то есть содержит все числа от 1 до N, то вывести 0, а в противном...

Как проверить первый элемент двумерного массива на 0? - C++
Всем привет. Дана функция ввода элементов двумерного массива. Необходимо вставить условие: если первый элемент массива равен 0, то...

Проверить содержит ли строка введенное слово - C++
Ввести строку, состоящую из нескольких слов, разделенных одним или несколькими пробелами. Проверить содержит ли строка введенное слово.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
28.02.2011, 17:17 #2
Если данные упорядочены - бинарный поиск, иначе - линейный.
1
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
И это, я так понимаю, будет самый быстрый поиск для обыкновенного вектора?
0
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
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
1
easybudda
Модератор
Эксперт CЭксперт С++
9623 / 5571 / 946
Регистрация: 25.07.2009
Сообщений: 10,697
28.02.2011, 19:30 #5
Цитата Сообщение от Damaks Посмотреть сообщение
Вот написал для вектора int'ов, но не работает
C++
1
std::cout << ( std::find(vector1.begin(), vector1.end(), 13) == vector1.end() ? "нету " : "есть " ) << 13 << " в массиве." << std::endl;
0
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
28.02.2011, 19:34  [ТС] #6
find, это который в algorithm? У меня он работает недопустимо медленно. Сейчас попробуй совет asics.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
28.02.2011, 20:48 #7
Damaks, find не может работать недопустимо медленно. Скорость зависит от кол-ва элементов в нем.
std::search для одного элемента не покатит.
Если find слишком медленно - либо пересмотрите используемый контейнер, либо binary_search после сортировки.
0
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, я прав?
0
asics
Freelance
Эксперт С++
2847 / 1784 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
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, заполни вектор по-другому)
1
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 диапазон, который нельзя задать одним числом, или у меня просто не получилось
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 00:06
Привет! Вот еще темы с ответами:

Проверить содержит ли массив простые числа - C++
Составить функцию, которая бы возвращала 1, если среди элементов массива есть хотя бы одно простое число, и возвращала 0, если массив не...

Проверить,содержит ли файл строку заданной длины. - C++
дан текстовый файл,состоящий из нескольких строк.Пользователь вводитс клавиатуры число. Проверить,содержит ли файл строку заданной...

Вектор. Проверить, упорядочены ли элементы - C++
Дан вектор - одномерный числовой массив. Проверку состояния массива оформить в виде логической функции. 1)Проверить, упорядочены ли...

Проверить, содержит ли заданный неориентированный граф хотя бы один цикл - C++
Циклом в графе называется маршрут, начальная и конечная вершины которого совпадают. Проверить, содержит заданный неориентированный граф...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.03.2011, 00:06
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru