【问题标题】:c++ Difference between two vector<MyType*> A and B based on a string memberc++ 基于字符串成员的两个vector<MyType*> A和B之间的区别
【发布时间】:2012-10-12 08:48:38
【问题描述】:

我有两个向量对象,分别称为 A 和 B。MyType 类没有字段 ID,我想获取 A 中但 B 中没有的 MyType*。

由于我没有ID需要根据字符串字段进行比较。

我的对象的类是这样的

 class Object 
    {
       public:
               Object();
       string      Name;
       bool        Mode;
       string      something;
       Int         range;
    }


    vector<Object*> a; //asssume filled with objects
    vector<Object*> b; //asssume filled with objects
    vector<Object*> ret; 

现在我想获取 (a,b) 的差异 - 所有成员都在 a 而不是 b。

如何进行。我尝试使用strcmp() 进行比较,但它不起作用。

【问题讨论】:

  • 很难说出你在问什么。也许一些代码会澄清一些事情。
  • 当然,strcmp 不适用于字符串数据类型,它适用于 char* 数据类型。此外,没有代码可以得出明确的答案。
  • 我在使用 strcmp 之前使用 c_str() 转换了字符串

标签: c++ string set set-difference


【解决方案1】:

b 的所有条目添加到set 中。然后尝试将a 的所有条目添加到该集合中——每个成功的条目是a 中但不在b 中的条目。

如果您要比较的是 Name 条目,而不是指针,请使用 set&lt;string&gt; 并将 Name 条目添加到集合中。

【讨论】:

  • 我想比较两个不同向量上所有对象的字符串字段。创建一个 set 只会告诉我哪些字符串是唯一的,但不会返回对象。
  • 对,但是当发生这种情况时,您将遍历对象。因此,当集合告诉您一个字符串是唯一的时,返回您刚刚将其字符串添加到集合中的对象。您将浏览对象,将它们的名称添加到集合中。当您遍历a 中的对象时(在遍历b 之后),添加的每个名称都告诉您应该返回您正在操作的a 中的对象。
  • 比必要的复杂。
【解决方案2】:

这使用了现有的 STL 算法:

bool compPtrByName(Object *const &p1, Object *const &p2) {
    return p1->Name < p2->Name;
}

然后调用

std::sort(a.begin(), a.end(), compPtrByName);
std::sort(b.begin(), b.end(), compPtrByName);
std::set_difference(a.begin(), a.end(), b.begin(), b.end(), ret.begin(), compPtrByName);

如果不允许对向量重新排序,则先复制它们。

注意:这给出了集合差 A - B。对于对称差 (A - B) 并集 (B - A),请使用 std::set_symmetric_difference

【讨论】:

    【解决方案3】:

    这对于set_difference (http://www.cplusplus.com/reference/algorithm/set_difference/) 来说似乎是一份完美的工作。

    为您的对象提供一个比较器,对两个向量进行排序(使用该比较器),然后使用set_difference(使用相同的比较器)获取第一个中的对象,而不是第二个中的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 2017-12-24
      • 2016-05-04
      • 1970-01-01
      • 2019-12-18
      • 2016-01-13
      相关资源
      最近更新 更多