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

时间:2017-10-12 12:33:26

标签: c++ c++11 vector matching

我正在编写一个估算光流量的模块。在每个时间步骤它消耗std :: vector,其中向量的每个元素是当前像素位置和先前像素位置。矢量未订购。之前未见过的新像素将出现,未找到的流量位置将消失。是否有正确的方法将新矢量中的元素与估计的光流位置集相匹配?

向量大约为2000个元素。

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

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

我怀疑有一种可接受的方法可以解决这个问题,但我没有接受任何综合训练。

我在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();
        }
}

1 个答案:

答案 0 :(得分:0)

不确定你需要什么,但假设你的viewDidLayoutSubviews是用整数向量构造的,那么顺序并不重要,你需要用其他向量检查这个向量(方法{ {1}})在匹配时做某事,我想你可以写下如下内容

Matcher

使用向量构造matchOpticalFlowNaive()对象,该向量用于初始化struct Matcher { std::set<int> oldSet; Matcher (std::vector<int> const & oldVect) : oldSet{oldVect.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