2017-01-31 2 views
2

Я получил два вектора, которые выглядят следующим образом: std::vector<std::tuple<unsigned int, unsigned int, float, Position, MemberOf>>C++: Слияние двух векторов с кортежами как элемент

Сначала я отсортирован их

std::sort(vector.begin(), vector.end(), sort_func()); 

struct sort_func { 
    inline bool operator() (std::tuple<unsigned int, float, Position> &element1, std::tuple<unsigned int, float, Position> &element2) { 
     if (std::get<1>(element1) < std::get<1>(element2) || (std::get<1>(element1) == std::get<1>(element2) && tau(element1) < tau(element2))) 
      return true; 
     else 
      return false; 
    } 

    unsigned int tau(std::tuple<unsigned int, float, Position> &element) { 
     if (std::get<2>(element) == end) 
      return 0; 
     else if (std::get<2>(element) == in_plane) 
      return 1; 
     else if (std::get<2>(element) == start) 
      return 2; 
    } 
}; 

Теперь я получил два отсортированных векторы, и я хочу, чтобы объединить они в пути, я их отсортировал. Я видел, что есть метод std::merge(). Но я не уверен, как использовать его этим сложным способом.

Может кто-нибудь объяснить мне, как я могу использовать мой sort_func при слиянии двух векторов?

Окончательный сводный список должен поддерживать порядок сортировки. Это и есть цель.

Спасибо за ваши советы!

+0

Что сольются делать? Поместить окончательный список в отсортированном порядке? – P0W

+0

@ P0W: Да точно. Извините, я отредактирую свой вопрос по этому поводу. – progNewbie

+0

Ну так же, как вы сделали для станда :: рода, предоставляя 'sort_func()', как * * Comp параметр [станд :: слияния] (http://en.cppreference.com/w/cpp/algorithm/merge). –

ответ

1

Вы можете использовать же сравнение объект функции в std::merge см второй версии тоже.

// v3 - output vector, v1, v2 -> sorted vector 
std::merge(
      v1.begin(), v1.end(), 
      v2.begin(), v2.end(), 
      std::back_inserter(v3), 
      sort_func() 
      ); 
+0

Охх спасибо. Виноват. – progNewbie

1

Как это:

std::vector<std::tuple<unsigned int, unsigned int, float, Position, MemberOf>> v1,v2,dst; 
//fill v1,v2 however you did it 
std::sort(v1.begin(), v1.end(), sort_func()); 
std::sort(v2.begin(), v2.end(), sort_func()); 
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst),sort_func()); 
0

Как уже упоминалось здесь: http://en.cppreference.com/w/cpp/algorithm/merge функция для сравнения двух экземпляров должен иметь подпись:

bool cmp(const Type1 &a, const Type2 &b); 

Таким образом, вы просто должны реализовать как то:

bool cmp(const std::tuple<unsigned int, float, Position, MemberOf> &element1, 
     const std::tuple<unsigned int, float, Position, MemberOf> &element2); 

Там вы можете назвать свою оригинальную функцию, если хотите. После внедрения его таким образом, вы должны быть в состоянии использовать:

std::vector<std::tuple<unsigned int, unsigned int, float, Position, MemberOf>> dest; // holds result 
std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), 
      std::back_inserter(dest), cmp); 

И кажется, что сравнивать параметры функции не имеют правильного типа, так как они отсутствуют часть MemberOf упоминается в первой строке.

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