【问题标题】:Combining vectors of string's组合字符串的向量
【发布时间】:2010-09-01 17:14:08
【问题描述】:

我有许多字符串向量,每个向量都包含日期。作为一个简单的例子向量 A 大小为 2 的可能包含:

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

而大小为 3 的第二个向量 B 可能包含:

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 和 B 时,我不希望有任何重复的日期,因此 C 的每个元素都必须是唯一的。有没有我可以调用的内置/stl(或Boost库)函数 会这样做吗?

谢谢!

【问题讨论】:

  • 我从你的最后一段中假设这是一个 C++ 问题,所以我将其标记为这样。它似乎也与日期无关,所以我删除了那个标签。
  • 没错,这是一个 C++ 问题。

标签: c++ string vector


【解决方案1】:

STL 中有a set_union function 用于查找两个(按字典顺序)排序的序列的并集。假设 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);

【讨论】:

  • 请注意,在这种情况下,sorted 表示按词法排序,而不是按日期排序(因此,“01-Aug-2010”将出现在“ 2010 年 7 月 2 日")。
  • @James:如果按日期排序,我们可以提供第 6 个参数。
  • 我认为“第 6 个参数”是指比较函数或函子?最好将其更详细地放入您的答案中,因为我认为此时我们可能会失去 Wawel100。
【解决方案2】:

您可以将集合(但不是多重集合)用作(中间)容器而不是向量。不过,这会删除您可能想要保留的任何顺序。

您还可以使用std::uniquestd::remove_ifstd::set_union(假设输入已排序)。

【讨论】:

  • 日期需要按顺序排列。
【解决方案3】:

我想你想要一个STL set。这将确保您没有重复。

【讨论】:

    【解决方案4】:

    如果 set 不适用 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 ()
          );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-08
      • 2023-01-12
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多