计算向量<vector <object>&gt; </vector <object>中重复元素的出现次数

时间:2015-03-07 14:50:00

标签: c++ vector

我有vector<vector<Rect>>Rect是一个openCV矩形对象。我想填充一个空的vector<pair<Rect,int>>,其中包含向量中重复(1次或多次出现)的所有矩形以及找到的出现次数。

我在下面的实施并没有给我预期的结果。这是我试过的:

vector<vector<Rect>> vec;
//...fill up vector vec...
vector<pair<Rect,int>> constantsVec;
bool found=false;

for(int j=0;j<vec.size()-1;j++){
    vector<Rect> temp1=vec[j];
    vector<Rect> temp2=vec[j+1];
    for(int x=0;x<temp1.size();x++){
        for(int y=0;y<temp2.size();y++){
            if(temp1[x]==temp2[y]){
                for(int k=0;k<constantsVec.size();k++){
                    if(constantsVec[k].first==temp1[x]){
                        found=true;
                        constantsVec[k]=make_pair(temp1[x],++constantsVec[k].second);
                    }
                }
                if(!found){
                    constantsVec.push_back(make_pair(temp1[x],0));
                }
            }
        }
    }
}

在一个重复三次的矩形的示例中,我最终得到constantsVec中的正确矩形,但是找到的出现次数为1,而不是3。

我应该补充说vector<Rect>向量本身的一个元素(vec)本身没有重复的矩形,但在vec向量的元素之间可以有重复的矩形。那些是我想要找到和计算的。

1 个答案:

答案 0 :(得分:1)

在O(n·log n)中有效且可能最简单的方法是使用地图。

首先创建一个Rect比较器以允许Rect进行索引(将其置于可访问的位置):

// Needed for O(n · log n) complexity
struct RectComparator {
    bool operator () (const Rect & a,const Rect & b) {
        if (a.x != b.x) return a.x < b.x;
        if (a.y != b.y) return a.y < b.y;
        if (a.width != b.width) return a.width < b.width;
        return a.height < b.height;
    }
};

要计算Rect rvec的{​​{1}}个数,请输入以下代码:

vector<vector<Rect> > vec;
//...fill up vector vec...

map<Rect, int, RectComparator> counts;
for (int i = 0; i < vec.size(); i++) {
    for (int j = 0; j < vec[i].size(); j++) {
        counts[vec[i][j]]++;
    }
}

我没有检查vec[i][j]上是否存在counts,就好像它没有,默认情况下它被初始化为零。

最后,counts[r]的{​​{1}}金额为Rect r

复杂性为vec O(n · log n) nRect对比vec。{/ p>


要遍历O(n^2)地图,这里是代码(如果需要,可以修改counts,并且constantsVec s出现多次):

Rect

考虑到构建和使用vector<pair<Rect, int> > constantsVec; map<Rect, int>::iterator iter; for (iter = counts.begin(); iter != counts.end(); ++iter) { // iter->first is the Rect // iter->second is the count of the Rect iter->first in vec if (iter->second > 1) constantsVec.push_back(make_pair(iter->first, iter->second)); } 只有在你多次使用它时才有意义,同时出现一次的矩形与出现不止一次的矩形之间的差异非常大。在其他情况下,使用constantsVec地图应该与使用counts

一样好