两个 std::vectors 之间的匹配元素

Posted

技术标签:

【中文标题】两个 std::vectors 之间的匹配元素【英文标题】:match elements between two std::vectors 【发布时间】:2017-10-12 12:33:26 【问题描述】:

我正在编写一个估计光流的模块。在每个时间步,它使用一个 std::vector,其中向量的每个元素是当前像素位置和前一个像素位置。向量未排序。以前未看到的新像素将出现,而未找到的流动位置将消失。是否有正确的方法将新向量中的元素与正在估计的光流位置集合匹配?

向量大约有 2000 个元素。

这些是我正在考虑的方法:

天真地迭代每个估计的光流位置的新向量 天真地迭代新向量,但删除每个匹配的位置,以便搜索在进行时变得更快 在我的列表和每个时间步的新列表上运行 std::sort。然后从最后一个匹配的索引 +1 开始遍历新向量

我怀疑有一种公认的方法可以解决这个问题,但我没有接受过任何 Comp sci 培训。

如果相关的话,我在 c++ 11 中。

// each element in the new vector is an int. I need to check if 
// there are matches between the new vec and old vec
void Matcher::matchOpticalFlowNaive(std::vector<int> new_vec)

for(int i = 0; i < this->old_vec.size(); i++)
    for(int j =0; j < new_vec.size(); j++)
        if(this->old_vec[i] == new_vec[j])
            do_stuff(this->old_vec[i],  new_vec[j])
            j = new_vec.size();
        

【问题讨论】:

一些代码好吗? minimal reproducible example @holmeski - 不确定但...你确定不是std::vectorstd::set(或std::multi_set)更适合你吗? 你最好用纯数据来表达。 c++中没有光流的概念。所以你不能有它的向量。您需要将现实世界的数据建模为 c++ 类型,然后解释您想要从这两个向量中提取的确切内容。编辑:你的功能没有意义。它只接受new_flowold_flow 在哪里? @max66,套装看起来确实更好,但这不是我通过的。我会考虑将新信息转换成一个集合。 听起来你想找到两个向量的交集。我建议这篇文章:geeksforgeeks.org/… 【参考方案1】:

不确定您需要什么,但是假设您的 Matcher 是用整数向量构造的,那么顺序并不重要,并且您需要将此向量与其他向量进行检查(方法 matchOpticalFlowNaive() ) 在有比赛的时候做点什么,我想你可以写如下内容

struct Matcher
 
   std::set<int> oldSet;

   Matcher (std::vector<int> const & oldVect)
      : oldSetoldVect.cbegin(), oldVect.cend()
     

   void matchOpticalFlowNaive (std::vector<int> const & newVec)
    
      for ( auto const & vi : newVec )
       
         if ( oldSet.cend() != oldSet.find(vi) )
            /* do something */ ;
       
    
 ;

Matcher 对象是用一个向量构造的,该向量用于初始化 std::set(或 std::multi_set,或无序集/多集?)以简化 matchOpticalFlowNaive() 中的工作

【讨论】:

以上是关于两个 std::vectors 之间的匹配元素的主要内容,如果未能解决你的问题,请参考以下文章

具有预定义大小的 C++ std::vectors

包装 std::vector 的 std::vectors,C++ SWIG Python

多个 std::vectors 来解决缓存问题?

将多个 std::vectors 复制到 1 的更好方法? (多线程)

MongoDB,按两个数组之间匹配元素的数量对结果进行排序

数据结构