我有两个持有不同类型对象的STL容器(当前为矢量)。这两种类型都有一个返回标识符的方法,该标识符可用于“比较”不同类型。两个容器中的元素未被排序,并且比较两个标识符可能是“昂贵的”(例如,字符串比较)。预计两个容器具有相似的尺寸,可能<&lt;&lt;每个100个元素。
我现在想要做以下事情:
所以这一切之后应该举行
有一种有效的方法吗?我只能想到一个具有O(2 * n * m)运行时复杂度的算法听起来太多了。
std::vector<T1> containerA;
std::vector<T2> containerB;
for(auto &elementA : containerA)
{
std::vector<T2>::iterator bIter = std::find_if(containerB.begin(), containerB.end(), [elementA](const T2 &elementB){ return (elementA.getId() == elementB.getId()); })
if(bIter == containerB.end())
{
// case 3
elementA.foo();
// remove elementA from containerA
}
// case 1
elementA.bar((*bIter));
}
for(const auto &elementB : containerB)
{
std::vector<T1>::iterator aIter = std::find_if(containerA.begin(), containerA.end(), [elementB](const T1 &elementA){ return (elementA.getId() == elementB.getId()); })
if(aIter == containerA.end())
{
// case 2
T1 newElement(elementB);
containerA.push_back(newElement);
}
}
答案 0 :(得分:1)
假设A sum B
上存在总订单,您可以尝试以下操作:
A'
= sorted A
B'
= sorted B
b
B'
中a
的每个A'
A'
b = a
进行排序(因为A
已排序,我们可以使用二分搜索),(b, a)
。如果不存在此类元素,则向a
添加新元素,否则对A'
b
B'
中B'
的每个a = b
a
A
进行排序(因为(a, b)
已排序,我们可以使用二分搜索),A
。如果不存在此类元素,则O(nlogn)
中删除标记{{1}},否则会对{{1}}执行操作时间复杂度为{{1}}