Объединяя векторы строки - PullRequest
       5

Объединяя векторы строки

3 голосов
/ 01 сентября 2010

У меня есть несколько векторов строк, каждая из которых содержит даты.В качестве простого примера вектор A размера 2 может содержать:

A[0] = "01-Jul-2010"; 
A[1] = "03-Jul-2010";

, тогда как второй вектор B размера 3 может содержать:

B[0] = "02-Jul-2010";
B[1] = "03-Jul-2010"; 
B[2] = "04-Jul-2010";  

Я хотел бы сформировать вектор Cкоторый содержит «объединение» элементов в A и B:

C[0] = "01-Jul-2010";
C[1] = "02-Jul-2010";
C[2] = "03-Jul-2010";
C[3] = "04-Jul-2010"; 

При объединении A и BI не нужно повторять даты, поэтому каждый элемент C должен быть уникальным.Есть ли какая-нибудь встроенная функция / stl (или библиотека Boost), которую я могу вызвать, которая сделает это?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 01 сентября 2010

В STL есть функция a set_union для нахождения объединения двух (лексикографически) отсортированных последовательностей. Предполагая, что A и B уже отсортированы,

#include <algorithm>
#include <iterator>
#include <vector>
#include <string>

...

std::vector<std::string> C;
std::set_union(A.begin(), A.end(), B.begin(), B.end(), std::back_inserter(C));

Если A и B отсортированы по дате, вам необходимо указать эту функцию / функтор сравнения дат, например,

bool is_earlier(const std::string& first_date, const std::string& second_date) {
   // return whether first_date is earlier than second_date.
}

...

std::set_union(A.begin(), A.end(), B.begin(), B.end(),
               std::back_inserter(C), is_earlier);
1 голос
/ 01 сентября 2010

Я думаю, вы хотите STL set .Это гарантирует, что у вас нет дубликатов.

1 голос
/ 01 сентября 2010

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

Вы также можете использовать std::unique, std::remove_if или std::set_union (при условии, что входы отсортированы).

0 голосов
/ 01 сентября 2010

Если набор не применим, std :: unique также возможен:

   std::vector<std::string> A;
   std::vector<std::string> B;
   std::vector<std::string> C;

   A.resize (2u);
   B.resize (3u);

   A[0] = "01-Jul-2010";  
   A[1] = "03-Jul-2010"; 

   B[0] = "02-Jul-2010"; 
   B[1] = "03-Jul-2010";  
   B[2] = "04-Jul-2010";   

   C.reserve (5u);

   std::copy (
      A.begin (),
      A.end (),
      std::back_inserter (C)
      );

   std::copy (
      B.begin (),
      B.end (),
      std::back_inserter (C)
      );

   // std::unique requires sorted vector
   std::sort (C.begin(), C.end());
   C.erase (
      std::unique (C.begin(), C.end()),
      C.end ()
      );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...