联合结构向量中共享相同变量值的元素

Unite elements that share the same value of a variable in a vector of structs

例如,我有这个结构:

struct Time
{
char Day[10];
int pay;
int earn;
}

并假设这个 Time 结构体的向量有以下元素:

vector<Time> mySelf = ({"Monday", 20, 40}, {"Tuesday", 15, 20}, {"Monday", 30, 10}, {"Tuesday", 10, 5});

那么有没有什么算法可以合并数据,使得具有相同日期名称的元素出现一次,这些元素的其他变量将组合在一起形成一个新的向量,如下所示:

vector<Time> mySelf = ({"Monday", 50, 50}, {"Tuesday", 25, 25});

您可以尝试将您的元素插入到unordered_map,然后重建一个向量。搜索和插入 map 具有 constant-time 复杂性,因此所有操作都是 O(n),因为我们需要对向量进行两次迭代。

    std::unordered_map<std::string, Time> timeMap;
    for (const auto& t : mySelf)
    {
        if (timeMap.count(t.day) == 0)
        {
            timeMap[t.day] = t;
        }
        else
        {
            timeMap[t.day].pay += t.pay;
            timeMap[t.day].earn += t.earn;
        }
    }

或更短的版本,因为 insert 已经检查元素是否存在并且不会覆盖它:

    for (const auto& t : mySelf)
    {
        timeMap.insert({t.day, {t.day,0,0}});
        timeMap[t.day].pay += t.pay;
        timeMap[t.day].earn += t.earn;
    }

然后向量重构:

    std::vector<Time> result;
    result.reserve(timeMap.size());
    for (const auto&[key, val] : timeMap)
    {
        result.push_back(val);
    }

或者您可以使用 std::unordered_set 但是您需要为您的结构提供一些哈希函数。也许你可以用移动语义进一步改进它。

live demo