2014-01-22 3 views
3

Я бы хотел сравнить два вектора, где у второго может быть больше/меньше предметов, чем у первого.есть ли std :: несоответствие для двух векторов неравного размера?

v1 = 1,2,3,4,5 

v2 = 1,0,3,4,5,6 

Насколько я понял, std::mismatch Привычка делать трюк. Как я могу обнаружить недостающий элемент в v1?

Спасибо заранее,

Orkun

+0

Сортировка и сравнение. – herohuyongtao

+0

Вы пробовали set_difference? http://www.cplusplus.com/reference/algorithm/set_difference/ – Trenin

+0

Или просто сравните с векторами с '=='. – Trenin

ответ

2

C++ 14 добавляет два additional overloads, что размещение различных размеров диапазонов

template< class InputIt1, class InputIt2 > 
std::pair<InputIt1,InputIt2> 
    mismatch(InputIt1 first1, InputIt1 last1, 
       InputIt2 first2, InputIt2 last2); 

template< class InputIt1, class InputIt2, class BinaryPredicate > 
std::pair<InputIt1,InputIt2> 
    mismatch(InputIt1 first1, InputIt1 last1, 
       InputIt2 first2, InputIt2 last2, 
       BinaryPredicate p); 

Вы можете быть в состоянии использовать эту установку -std=c++1y на НКУ и лязге

+1

Поддержка C++ 14 может быть немного оптимистичной на данный момент! – Sean

+2

@Sean Действительно, libstdC++ [не делает] (http://coliru.stacked-crooked.com/a/894d25237202ccdf) содержит эти перегрузки, но просматривает последний libC++ [источник] (http://llvm.org/ svn/llvm-project/libcxx/trunk/include/algorithm) Я могу найти их обоих. Таким образом, clang + libC++ может быть вариантом. Изменить: последний libstdC++ [источник] (http://repo.or.cz/w/official-gcc.git/blob/HEAD:/libstdc%2B%2B-v3/include/bits/stl_algobase.h#l1334) включает их тоже. – Praetorian

1

set_symmetric_difference(), bu т перед этим диапазонов источника должны быть заказаны:

vector<int> v1; 
vector<int> v2; 

// ... Populate v1 and v2 

// For the set_symmetric_difference algorithm to work, 
// the source ranges must be ordered!  
vector<int> sortedV1(v1); 
vector<int> sortedV2(v2); 

sort(sortedV1.begin(),sortedV1.end()); 
sort(sortedV2.begin(),sortedV2.end()); 

// Now that we have sorted ranges (i.e., containers), find the differences  
vector<int> vDifferences; 

set_symmetric_difference(
    sortedV1.begin(), sortedV1.end(), 
    sortedV2.begin(), sortedV2.end(), 
    back_inserter(vDifferences)); 

После этого, все различные элементы этих двух векторов (т.е. либо в v1, либо v2, но не оба) будут храниться в vector<int> vDifferences. Для вашего примера это будет {0, 2, 6}.

[...] Вычисляет симметричную разность двух отсортированных диапазонов: элементы, которые находятся в любом из диапазонов, но не в обоих из них, копируются в диапазон, начинающийся с d_first. Полученный диапазон также сортируется. [...]

Если вам просто нужно недостающие элементы в v1, вы можете дополнительно просканировать vDifferences против sortedV1, чтобы найти их.

Отъезд this discussion для получения дополнительной информации.

Смежные вопросы