19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
1

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

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

Author24 — интернет-сервис помощи студентам
Есть заполненный вектор:
C++
1
std::vector<std::string> us;
Как наиболее быстро определить, есть ли в нём определенный элемент?
Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2011, 15:56
Ответы с готовыми решениями:

Постройте вектор, каждый элемент которого содержит наименьший по абсолютной величине элемент строки
Постройте вектор, каждый элемент которого содержит наименьший по абсолютной величине элемент...

Массив: Найти максимальный по модулю элемент, а строку, которая содержит этот элемент, переслать в вектор
Создать двумерный массив i=3,j=4 формула вычисления элементов a=(sqr(i)*i)+4*(sqr(j)-15 ...

В матрице размером NxM поменять местами строку, которая содержит элемент с наибольшим значением со строкой, которая содержит элемент с наименьшим
В матрице размером NxM поменять местами строку, которая содержит элемент с наибольшим значением со...

Как создать вектор, который содержит классы?
Нужно что-то подобное (пример на c++): vector &lt;MyStruct&gt; v; //Вектор v содержит структуры...

9
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
28.02.2011, 17:17 2
Если данные упорядочены - бинарный поиск, иначе - линейный.
1
19 / 11 / 0
Регистрация: 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
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
28.02.2011, 19:06 4
Damaks, Если уже юзаете вектора, то будет логично использовать и конкретные алгоритмы(STL). Для вашего случая:
Цитата Сообщение от silent_1991 Посмотреть сообщение
бинарный поиск
http://www.cppreference.com/wi... ary_search
Цитата Сообщение от silent_1991 Посмотреть сообщение
линейный
http://www.cppreference.com/wi... thm/search
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
28.02.2011, 19:30 5
Цитата Сообщение от Damaks Посмотреть сообщение
Вот написал для вектора int'ов, но не работает
C++
1
std::cout << ( std::find(vector1.begin(), vector1.end(), 13) == vector1.end() ? "нету " : "есть " ) << 13 << " в массиве." << std::endl;
1
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
28.02.2011, 19:34  [ТС] 6
find, это который в algorithm? У меня он работает недопустимо медленно. Сейчас попробуй совет asics.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
28.02.2011, 20:48 7
Damaks, find не может работать недопустимо медленно. Скорость зависит от кол-ва элементов в нем.
std::search для одного элемента не покатит.
Если find слишком медленно - либо пересмотрите используемый контейнер, либо binary_search после сортировки.
0
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
01.03.2011, 23:35 8
Насколько я знаю
find - ищет определенное значение и возвращает итератор
binary_search - ищет диапазон значений по отсортированному вектору и возвращает bool значение (есть/нету)
search - ищет диапазон значений по вектору и возвращает bool значение.
По скорости получается сначала binary_search, потом find, потом search, но для поиска одного числа быстрее find, я прав?
0
Freelance
Эксперт С++
2891 / 1826 / 356
Регистрация: 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
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
02.03.2011, 00:06 10
Да, уже понял что ошибся
А про скорость ничего не скажете, что лучше для поиска по вектору int'ов?
Я вот сейчас замерил скорость find, а в search походу если одно число искать, а не диапазон, то мне надо задать его дважды, т.к. там можно задать только диапазон, правильно я мыслю? Или search предназначен только для поиска диапазона, и для поиска определенного числа его использовать неправильно?

Добавлено через 20 минут
Попробовал задать начальное и конечное значение одним числом, не вышло. Оказалось что разница между binary_search и search больше чем возможность поиска по несортированному вектору. binary_search ищет определенное число (у меня получилось его запустить), в то время как search диапазон, который нельзя задать одним числом, или у меня просто не получилось
0
02.03.2011, 00:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2011, 00:06
Помогаю со студенческими работами здесь

Сформировать вектор B=(b1,b2,…bm), каждый элемент которого определяется как минимальный элемент соответствующего столбца исходной матрицы A(n,m)
Сформировать вектор B=(b1,b2,…bm), каждый элемент которого определяется как минимальный элемент...

Как проверить, содержит ли the_content(); определенное слово
Привет пытаюсь выявлять слово в Титле что бы оперировать словами в шаблоне для Сео Делаю вот так ...

Как проверить содержит ли строка русские символы ?
Помогите плз. Нужно проверять содержит ли строка введенная пользователем русские символы или нет ?...

Как проверить, что переменная содержит не число?
if (($NumberData+1)==($NumberData-1)) не помогает.


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru