保留顺序的微妙问题是其他人忽略的。
我提出了三种方法:
1.创建一个新容器
如果您想保留订单,您可以使用“合并”功能,例如
住在科利鲁
vector<entry> consolidate(vector<entry> const& in)
{
vector<entry> result;
for (auto& e : in)
{
auto found = find_if(begin(result), end(result), [&e](entry const& a) { return a.name == e.name; });
if (end(result) == found)
result.push_back(e);
else
found->quantity += e.quantity;
}
return result;
}
2.就地合并算法:
住在科利鲁
void consolidate(vector<entry>& data)
{
auto f = data.begin(), l = data.end();
while (f!=l)
{
auto match = find_if(begin(data), f, [&](entry const& a) { return a.name == f->name; });
if (match != f)
{
match->quantity += f->quantity;
f = data.erase(f);
l = data.end();
} else
{
f++;
}
}
}
3.使用map
如果您不介意更改顺序,请使用其他答案中建议的地图:
住在科利鲁
#include <map>
#include <string>
#include <iostream>
using namespace std;
struct entry {
string name;
unsigned quantity;
};
int main()
{
const entry array[] = {
{ "apple", 5 },
{ "pear", 2 },
{ "grape", 6 },
{ "mango", 3 },
{ "apple", 2 },
{ "mango", 9 },
};
map<string, unsigned> m;
for (auto& e : array)
m[e.name] += e.quantity;
for (auto& e : m)
cout << e.first << " " << e.second << "\n";
}