Как сравнить элементы данных из 2 векторов (индекс по индексу) и сохранить разностные элементы в 3-м векторе. set_difference
параметр set_difference
обеспечивает почти все, но я хочу сравнить location wise
элементов данных с location wise
местоположением, а не просто сортировать их.
т.е. std::vector<double> m_vector1
имеет элементы (3,7,8,9) 4 элемента на месте 0,1,2,3 соответственно.
std::vector<double> m_vector2
имеет элементы (3,5,7,9) 4 элемента на месте 0,1,2,3 соответственно.
std::vector<double> m_vector3 (5,7)
Когда я сравниваю данные, этот вектор должен хранить измененные данные vector 2
в местах [0](5) and [1](7)
.
Обратите внимание: если я использую set_difference
это даст мне только 5, и я хочу 5 и 7, потому что значения данных изменились в обоих местоположениях.
Здесь альтернатива, которая использует std::mismatch
для поиска пар несовпадающих для вас. Вы передаете те же аргументы, что и для std::mismatch
и возвращает вектор соответствующего типа. Некоторые из вытянутых материалов (например, определение типа) могут быть сильно уменьшены с помощью С++ 11 и С++ 14, но функция as работает с С++ 03.
template<typename It>
std::vector<typename std::iterator_traits<It>::value_type>
all_mismatches(It first, It last, It first2) {
std::vector<typename std::iterator_traits<It>::value_type> ret;
for (std::pair<It, It> p = std::make_pair(first, first2);
(p = std::mismatch(p.first, last, p.second)).first != last;
++p.first, ++p.second
) {
ret.push_back(*p.second);
}
return ret;
}
Специальное примечание, так как вы сравниваете double
в том, что если вы не уверены, что они будут сравнивать точно равны, вы можете просто взять дополнительный Compare
аргумент типа и аргумент функции для обработки сравнения с плавающей точкой и передать его прямо в std::mismatch
.
Наконец, это предполагает, что первый диапазон - это более короткий диапазон, точно так же, как std::mismatch
до С++ 14. Если вы хотите, вы можете сделать то, что std::mismatch
делает сейчас, и взять два полных диапазона, а затем убедиться, что вы не выходите за пределы конца, или просто передайте оба в std::mismatch
и дайте ему сделать работу, если у вас есть С++ 14.
Вы можете использовать стандартный алгоритм std::copy_if
с выражением лямбда или написать соответствующий цикл самостоятельно.
Например
#includde <algorithm>
#include <oterator>
#include <vector>
int main()
P
//...other stuff
std::vector<double>::iterator it1 = m_vector1.begin();
std::copy_if( m_vector2.begin(), m_vector2.end(), std::back_inserter( m_vector3 ),
[&]( double x ) { return ( x != *it1++ ); } );
Или
std::vector<double>::iterator it1 = m_vector1.begin();
for ( double x : m_vector2 )
{
if ( x != *it1++ ) m_vector3.push_back( x );
}
std::mismatch
.