连接两个对象容器,如果已经存在则添加元素
Joining two containers of objects, adding elements if already present
我有两个容器的对象类型为:
struct Element
{
int A;
int B;
Element operator+=(const Element& rhs)
{
if(A != rhs.A)
throw std::runtime_error("Not like this");
B += rhs.B;
return *this;
}
};
inline Element operator+(Element lhs, const Element& rhs)
{
lhs += rhs;
return lhs;
}
现在我想像这样连接这两个容器:
- 如果目标容器中没有其他元素具有相同的值A,则插入
- 如果目标容器中的另一个元素具有相同的值A,则将已经存在的元素和新元素一起添加
我想知道是否有一个优雅的解决方案(比仅仅有两个向量和循环它们短)使用不同的容器而不是向量。
使用类型为std::map<int, Element>
的映射,其中键是A
的值如何?
std::map<int, Element> m1;
std::map<int, Element> m2;
// add something in m1 e/o m2
for ( auto const & e : m2 )
{
m1[e.first] += e.second;
}
关键是m1[e.first]
返回对m1
中键为e.first
的元素的引用,如果存在,或者创建它,如果不存在,返回对新创建元素的引用。
重要的是要有一个Element的默认构造函数,为新创建的元素的A
值赋予一个特殊的值,意思是"从添加的Element
中吸收A
值"。
但是可以在Element
中给出A
的值,如果它只用作映射的键
相关文章:
- C++擦除(如果存在)
- 如果存在从"双精度"到"T"的转换,则禁用构造函数
- 键入特征以接收 T::value_type(如果存在),否则键入 T
- 我打算调用initializer_list构造函数,如果存在,则事先调用复制构造函数:为什么?
- 如果存在 QSQLITE 数据库,则根据 qt 中的行值插入或更新
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C++错误:在令牌之前'{'预期','或';'(如果存在)
- 如何将向量一的所有元素与向量二进行比较,如果存在最大元素,则将向量二的所有元素与向量三进行比较?
- 如果存在哈希,请加快C unordered_map插入
- c++ 检查 Unix 中是否存在目录,如果存在,则调用 void 函数
- 调用成员函数(如果存在),回退到自由函数,反之亦然
- 返回成员变量(如果存在)
- 如何将一个数组的每个元素与另一个元素进行比较(如果存在),然后打印是,否则否
- 如果存在任何循环关系,我应该假设弱指针使用吗?
- 如果存在条件,是否有更简单的表示形式
- C 设置值(如果存在成员)
- true/false功能如果存在总和
- 如果存在查询图像,则可以通过数据库中的单个图像获得面部识别
- C++检查文件是否存在,如果存在,则更改输出
- 方法,该方法调用所有基类的同名方法(如果存在),并将返回值保存到列表中