联合结构向量中共享相同变量值的元素
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
但是您需要为您的结构提供一些哈希函数。也许你可以用移动语义进一步改进它。
例如,我有这个结构:
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
但是您需要为您的结构提供一些哈希函数。也许你可以用移动语义进一步改进它。