【问题标题】:Remove duplicate elements from vector of structs (C++)从结构向量中删除重复元素(C++)
【发布时间】:2020-08-07 06:30:55
【问题描述】:

我有一个名为ParsedFlag 的结构向量;

struct ParsedFlag {
    std::string flag, value;

    ParsedFlag init(std::string f, std::string v)
    {
        flag = f;
        value = v;

        return *this;
    }
}

现在,我有重复的条目,如下所示:

(gay, yes)
(verbose, haha ok)
(desc, yeah okay)
(desc, yeah okay)
(a, 2)
(a, 2)
(c, c)
(f, f)
(g, 1)
(a, a)
(b, b)
(c, 1)

我的目标是删除所有已存在的重复项:(desc, yeah okay)(a, 2)

我该怎么做?

【问题讨论】:

  • 首先,我将在 ParsedFlag 中实现 == 比较运算符。那么你应该可以使用 std::vector::erase 方法
  • StackOverflow 上有各种针对此问题的问题。就像在保持排序顺序的同时删除所有重复项或删除重复项并对它们进行排序一样。您对这些解决方案有何问题?

标签: c++ vector struct compare


【解决方案1】:

解决问题的最简单方法是重载“==”运算符。步骤 1 中完成的操作。步骤 2 仅为方便起见(为 cout 方法重载“

#include <iostream>
#include <vector>
using namespace std;

struct ParsedFlag {
    std::string flag, value;

ParsedFlag init(std::string f, std::string v)
{
    flag = f;
    value = v;

    return *this;
}
};

//1)
inline bool operator==(const ParsedFlag& lhs, const ParsedFlag& rhs)
{
    return lhs.flag == rhs.flag and lhs.value == rhs.value;
}

//2
ostream& operator<<(ostream& os, const ParsedFlag& fl)
{
    os << fl.flag << ' ' << fl.value;
    return os;
}

int main() {
    std::vector<ParsedFlag> vec
    {
        {"gay", "yes"},
        {"gay", "yes"},
        {"verbose", "haha ok"},
        {"desc", "yeah okay"},
        {"desc", "yeah okay"}
    };
    
    for(const auto& fl : vec)
    {
        cout << fl << endl;
    }

    //3
    auto prev_it = vec.begin();
    for (auto it = vec.begin() + 1; it != vec.end(); ) 
    {
        if (*it == *prev_it)
        {
            it = vec.erase(it);
        } else 
        {
            ++it;
            ++prev_it;
        }
    }
    
    cout << "--- after---" <<endl;
    for(const auto& fl : vec)
    {
        cout << fl << endl;
    }
    return 0;
}

另一种解决方案是使用 std :: find_if 函数和 for_each 循环

【讨论】:

  • 提供一段代码和一个后置脚本不称为答案。它应该有足够的信息来理解它的作用,尤其是。 OP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多