如何比较和存储 2 个向量的数据元素位置

How to compare and store data elements of 2 vectors position wise?

本文关键字:向量 数据 位置 元素 存储 何比较 比较      更新时间:2023-10-16

如何比较 2 个向量的数据元素(逐个索引)并将差分枚举存储在第 3 个向量中。这个set_difference几乎提供了所有东西,但我想location wise位置比较数据元素,而不仅仅是通过对它们进行排序。

std::vector<double> m_vector1在位置0,1,2,3上分别具有元素(3,7,8,9)4个元素。

std::vector<double> m_vector2在位置 0、1、2、3 上分别具有元素 (3,5,7,9) 4 个元素。

std::vector<double> m_vector3 (5,7) 当我比较数据时,这个向量应该在位置[0](5) and [1](7)上存储vector 2的更改数据。

请注意:如果我使用 set_difference它只会给我 5,我想要 5 和 7,因为两个位置的数据值都发生了变化。

这是一个利用std::mismatch为您找到不匹配对的替代方法。您传递与std::mismatch相同的参数,它会返回适当类型的向量。一些绘制的内容(例如弄清楚类型)可以通过 C++11 和 C++14 严重减少,但该功能适用于 C++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直到 C++14 一样。如果你愿意,你可以做std::mismatch现在做的事情,采取两个完整的范围,然后确保你不会超过任何一个范围的终点,或者只是把两个都传递到std::mismatch,如果你有C++14可用,让它做工作。

您可以将标准算法std::copy_if与 lambda 表达式一起使用,也可以自己编写相应的循环。

例如

#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 );
   }