Я сомневаюсь, что в стандартной библиотеке для вас есть идеальный алгоритм. Объем работы зависит от того, предварительно отсортированы два вектора или нет, или вы можете отсортировать их.
Если вы не можете отсортировать свои векторы, то вы остаетесь на территории O (n ^ 2), поскольку для удаления каждого элемента в B из A вам придется искать A один раз, чтобы найти его.
Хорошей сортировкой является O (n lg n), поэтому предварительная сортировка в целом быстрее, чем не сортировка.
Если производительность не является проблемой, используется метод грубой силы
IXMLDOMNodePtr transformIfInB(IXMLDOMNodePtr ptr) { return find(B.begin(),B.end(), ptr) != B.end() ? 0 : ptr; }
...
std::transform(A.begin(),A.end(),A.begin(),transformIfInB);
Если два вектора отсортированы, возможно, лучше перебрать их параллельно
typedef std::vector<IXMLDOMNodePtr>::iterator vecIt;
vecIt itA, itB;
std::sort(A.begin(),A.end());
std::sort(B.begin(),B.end());
for(itA = A.begin(), itB = B.begin(); itB != B.end() && itA != A.end(); )
{
if(*itA < *itB) ++itA;
else if(*itA == *itB) *itA++ == 0;
else if(*itA > *itB ) ++itB;
}
В этом цикле мы держим два итератора в B и A. Мы перемещаем A вперед, пока он меньше B - поэтому мы знаем, что до этого в A нет элементов, которые существуют в B, потому что они отсортированы. Мы перемещаем B вперед, если верно обратное. Если они совпадают, мы обнуляем элемент по вашему вопросу.