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

Поиск нескольких элементов массива/вектора - C++

Восстановить пароль Регистрация
 
Tilesto
5 / 5 / 0
Регистрация: 14.05.2015
Сообщений: 125
Завершенные тесты: 1
02.09.2015, 01:16     Поиск нескольких элементов массива/вектора #1
Всем доброго времени суток. После нескольких часов безуспешного мозгового штурма и интернет-серфинга решил задать вопрос здесь. Попытаюсь ясно сформулировать.

У меня есть несколько переменных. Пусть это буду x,y,z. Есть несколько массивов A[], B[], C[]. В этих массивах различные переменные, но среди них есть те самые x y z. Только в одном массиве, например, есть только x, в другом только y. Мне надо найти тот массив, в котором встречаются все 3 переменные.

Это может быть не массив, а например вектор, карта, может быть класс или еще все что угодно. Как организовать такой поиск значений? Чтобы было несколько последовательностей различных переменных, а надо найти только ту, в которой находятся все переменные, которые задал юзер.

P.S. У меня есть предположение одно. Перебрать все элементы массива, и если какой-то из элементов равен x, то перебрать все элементы заново и найти y. Так же z. Но это слишком уж "колхозно". У меня этих массивов может быть много. И придется все перебирать, да еще и по несколько раз. Слишком затратно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monty_Python
 Аватар для Monty_Python
8 / 8 / 4
Регистрация: 31.07.2015
Сообщений: 39
02.09.2015, 01:42     Поиск нескольких элементов массива/вектора #2
как вариант ищи сразу все три элемента в одном массиве, чтоб заново не перебирать.
навскидку: создать 3 флага, они будут соответствовать совпадению для каждого элемента, если все три флага тру, значит это твой нужный массив.
Tilesto
5 / 5 / 0
Регистрация: 14.05.2015
Сообщений: 125
Завершенные тесты: 1
02.09.2015, 01:48  [ТС]     Поиск нескольких элементов массива/вектора #3
Monty_Python, про флаги и не подумал. Спасибо!) Работа по поиску элементов в одном массиве упростилась) А вот что с поиском по всем массивам. Мне все-таки придется их все перебирать на наличие той или иной переменной?

P.S. Просто это я вопрос задал для понимания вообще - как можно организовать поиск по массивам. Но на будущее я хочу уже сделать оконное приложение, в котором будут поля для нескольких переменных, и я не знаю сколько изначально пользователь их задаст. Как сделать флаги, не зная изначально сколько их?
Monty_Python
 Аватар для Monty_Python
8 / 8 / 4
Регистрация: 31.07.2015
Сообщений: 39
02.09.2015, 01:58     Поиск нескольких элементов массива/вектора #4
Цитата Сообщение от Tilesto Посмотреть сообщение
А вот что с поиском по всем массивам. Мне все-таки придется их все перебирать на наличие той или иной переменной?
Два условия выхода из цикла по переборам массивов:
1. Делается break как только найден нужный массив.
2. Перебираются все массивы.
Цитата Сообщение от Tilesto Посмотреть сообщение
Как сделать флаги, не зная изначально сколько их
Зависит от алгоритма и этапа когда будет определено необходимое количество элементов которые нужно найти. Можно вначале создать вектор, а затем когда узнаем количество то проинициализировать его нулями. Когда необходимый элемент найден то вместо нуля записываем единицу (поднимаем флаг), если в векторе все элементы равны единицам, то значит мы нашли наш массив, а если нет, то заново инициализируем его нулями и проверяем на соответствия в следующем массиве.
Tilesto
5 / 5 / 0
Регистрация: 14.05.2015
Сообщений: 125
Завершенные тесты: 1
02.09.2015, 02:01  [ТС]     Поиск нескольких элементов массива/вектора #5
Monty_Python, и почему этому не учат в универе) Спасибо большое)
S_el
1908 / 1503 / 296
Регистрация: 15.12.2013
Сообщений: 5,923
02.09.2015, 10:06     Поиск нескольких элементов массива/вектора #6
Цитата Сообщение от Tilesto Посмотреть сообщение
Но это слишком уж "колхозно".
используйте для отсортированных данных алгоритм:
http://www.cplusplus.com/reference/algorithm/includes/
AlukardX
8 / 8 / 3
Регистрация: 02.03.2013
Сообщений: 53
03.09.2015, 13:47     Поиск нескольких элементов массива/вектора #7
вот примитивная проверка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
void main()
{
    int x, y, z;
    int A[20] = {1,2,3,4,5,6,7,8,9,10};
    int B[20] = {11,12,13,14,15,16,17,18,19,20};
    int C[20] = {11,12,13,14,15,16,17,18,19,20};
    std::cout << "Input X Y Z";
    std::cin >> x >> y >> z;
    for (int i = 0; i < 20; i++)
    {
        for (int j = 0; j < 20; j++)
        {
            for (int k = 0; k < 20; k++)
            {
                if((A[i]==x && A[j] == y && A[k] == z))
                {
                    std::cout << "In Mass A find x and y and z"<< std::endl;
                }
                if ((B[i] == x && B[j] == y && B[k] == z))
                {
                    std::cout << "In Mass B find x and y and z" << std::endl;
                }
                if ((C[i] == x && C[j] == y && C[k] == z))
                {
                    std::cout << "In Mass B find x and y and z" << std::endl;
                }
            }
        }
    }
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2015, 17:32     Поиск нескольких элементов массива/вектора
Еще ссылки по теме:

C++ Поиск одинаковых элементов массива
C++ Удаление из вектора нескольких объектов

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

Или воспользуйтесь поиском по форуму:
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
03.09.2015, 17:32     Поиск нескольких элементов массива/вектора #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <vector>
#include <algorithm>
 
int main()
{
   std::vector<int> v1{1,2,3,4,5,6,7};
   std::vector<int> v2{1,2,3,4,0,6,7};
   std::vector<int> v3{2,5,7};
   std::cout << std::boolalpha;
   std::cout << std::includes(v1.begin(), v1.end(),
                              v3.begin(), v3.end()) << std::endl;
   std::cout << std::includes(v2.begin(), v2.end(),
                              v3.begin(), v3.end()) << std::endl;
}
Добавлено через 2 часа 34 минуты
Еще такой вариант для ассоциативных контейнеров. Но это для любителя С++11.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
#include <set>
#include <map>
#include <type_traits>
#include <initializer_list>
 
template <template<typename...> class Cont, typename... TArgs, typename... Args>
bool find_elems(const Cont<TArgs...> &cont, const Args &... args)
{
   using key_type = typename std::remove_reference<decltype(cont)>::type::key_type;
   using key_compare = typename std::remove_reference<decltype(cont)>::type::key_compare;
 
   std::multiset<key_type, key_compare> v = {args...};
   for(const auto &key : v)
      if (cont.find(key) == cont.end())  return false;
   return true;
}
 
int main()
{
   std::set<int> s{1,2,3,4,5,6,7};
   std::map<std::string, int> m{{"hello", 1}, {"abc", 2}, {"abra", 5}, {"world", 4}};
 
   std::cout << std::boolalpha;
   std::cout << find_elems(s, 3,2,7,1) << std::endl;
   std::cout << find_elems(s, 0,3,2,7,0,1) << std::endl;
 
   std::cout << find_elems(m, "hello", "world") << std::endl;
   std::cout << find_elems(m, "hello", "world", "wrong") << std::endl;
}
Yandex
Объявления
03.09.2015, 17:32     Поиск нескольких элементов массива/вектора
Ответ Создать тему
Опции темы

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