2014-10-20 2 views
2

У меня есть структура и два вектора, как этотнайти в векторе структуры

struct CodeColor 
{ 
int index; 
string color; 
}; 


std::vector<CodeColor> secret_code; 
std::vector<CodeColor> my_code; 

мне нужно искать в каждом элементе из my_code в secret_code. Что мне нужно, чтобы есть, для каждого элемента в my_code

  1. Есть ли элемент в secret_code, которые соответствуют как index и color.
  2. Если нет, есть ли товары, которые соответствуют только color
  3. Ни один из двух вышеперечисленных.

На самом деле я могу сделать это двумя способами для циклов, но я не люблю делать это (учитывая сложность времени). Я пытаюсь использовать find_if или любым другим способом. любое предложение?

+0

Можно ли повторить CodeColors в векторах? – fhsilva

+0

Да, цвет повторен там –

+0

одной петли достаточно. –

ответ

0

Вы можете использовать этот подход:

#include <algorithm> 
#include <set> 

set<CodeColor> intersect; 
set_intersection(secret_code.begin(),secret_code.end(),my_code.begin(),my_code.end(), // sorted! 
        std::inserter(intersect,intersect.begin())); 

В этом подходе,

template< class InputIt1, class InputIt2, class OutputIt > 
OutputIt set_intersection(InputIt1 first1, InputIt1 last1, 
          InputIt2 first2, InputIt2 last2, 
          OutputIt d_first); 

Создает отсортированный диапазон, начинающийся в d_first, состоящий из элементов, которые находятся в обеих отсортированных диапазонах [first1, last1) и [first2, last2). Первая версия предполагает как входные диапазоны должны быть отсортированы с оператором < Итак, вам нужно перегружать < operator для CodeColor

+0

Отличное решение! Не потребуется ли перегрузка оператора на «CodeColor»? – JorenHeit

+0

@Debasish Jana, не могли бы вы немного объяснить? –

+0

Оператор <должен быть перегружен для CodeColor –

1

Вы можете написать функцию, аналогичную функции в этом демонстративном примере Вектор secret_code просматривается только один раз.

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 

struct CodeColor 
{ 
    int index; 
    std::string color; 
}; 

enum class SEARCH_RESULT { NO_MATCH, PARTIAL_MATCH, EXACT_MATCH }; 

SEARCH_RESULT find(const std::vector<CodeColor> &v, const CodeColor &value) 
{ 
    SEARCH_RESULT result = SEARCH_RESULT::NO_MATCH; 

    auto it = std::find_if(v.begin(), v.end(), 
          [&value](const CodeColor &c) 
          { 
           return (c.color == value.color); 
          }); 

    if (it != v.end()) 
    { 
     result = SEARCH_RESULT::PARTIAL_MATCH; 
     it = std::find_if(it, v.end(), 
          [&value](const CodeColor &c) 
          { 
          return (c.index == value.index && 
            c.color == value.color); 
          }); 
     if (it != v.end()) result = SEARCH_RESULT::EXACT_MATCH; 
    } 

    return result; 
} 

int main() 
{ 
    std::vector<CodeColor> secret_code = 
    { 
     { 1, "Red" }, { 2, "Green" }, { 3, "Blue" } 
    }; 

    std::vector<CodeColor> my_code = 
    { 
     { 2, "Green" }, { 1, "Blue" } 
    }; 

    for (const CodeColor &c : my_code) 
    { 
     std::cout << static_cast<int>(find(secret_code, c)) << ' '; 
    } 
    std::cout << std::endl; 

    return 0; 
} 

Выход

2 1 

Вы можете переписать функцию таким образом, что она будет возвращать пару Перечислитель и соответствующий итератор.

+0

+1 Требуется только 1 сквозной проход. –

+0

Но find_if is O (N), это O (N^2), и OP пытался этого избежать. –

+0

@Will Briggs Я никогда не говорил, есть ли O (N^2) или O (N). Я показал, как в одном цикле определить, есть ли совпадение. –

Смежные вопросы