Как сравнивать и хранить элементы данных для двух векторов по позициям?

0

Как сравнить элементы данных из 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, потому что значения данных изменились в обоих местоположениях.

  • 0
    Похоже, вы хотите построить что-то из std::mismatch .
  • 0
    @chris: Да, мне нужно std :: mismatch, но как сохранить эти элементы несовпадения в третьем векторе. Не могли бы вы написать?
Показать ещё 1 комментарий
Теги:
vector

2 ответа

1
Лучший ответ

Здесь альтернатива, которая использует 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.

  • 0
    Очень хороший способ объяснить с помощью предварительных концепций! :)
1

Вы можете использовать стандартный алгоритм 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 );
   }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню