【问题标题】:std::sort on vector of vectorstd::sort 在向量的向量上
【发布时间】:2016-02-24 16:12:34
【问题描述】:

我实际上是在尝试根据描述符中包含的向量对描述符的向量进行排序

float           xi, yi;     // Descriptor location
vector<double>  fv;         // The feature vector

(这里是名为 fv 的向量) 我想要做的是在 Descriptor 的向量中搜索(为了更清楚起见,我将其命名为 Vec_Desc )具有最大方差的维度 为此,我使用:

double Tree::_get_mean(vector<Descriptor>& vec, int indice)
{
    double sum = 0;
    int size = vec.size();
    for (int i = 0; i < size; i++) {
        sum += vec[i].fv[indice];
    }
    sum /= size;
    return sum;
}

double Tree::_get_variance(vector<Descriptor>& vec, int indice)
{
int size = vec.size();
double var = 0;
double mean = _get_mean(vec, indice);
    for (int i = 0; i < size; i++) {
        var += ((vec[i].fv[indice] - mean) *  (vec[i].fv[indice] - mean)) / size;
    }
    return var;
}

int Tree::choose_dimension(vector<Descriptor>& vec)
{
    double var = _get_variance(vec, 0);
    int indice = 0;
    for (int i = 1; i < vec[0].fv.size(); i++) {
         if (var > _get_variance(vec, i)) {
            var = _get_variance(vec, i);
            indice = i;
        }
    }
}

然后我想根据我找到的暗淡对 vec_desc 进行排序。 尝试这样做:

class _compare {
    int step;
public: 
     _compare(int s) : step(s) {}

    bool operator()(const vector<double>& p1, const vector<double>& p2) {
        return p1[step] < p2[step];
    }
};

void Tree::_sort_vector(vector<Descriptor>& vec, int i)
{
    std::sort(vec.begin(), vec.end(), _compare(i));
}

void Tree::sort_vector(vector<Descriptor>& vec)
{
    _sort_vector(vec, choose_dimension(vec));
}

但是有了这个,我将使用他自己的值对 vec_desc 进行排序,而不是 fv 中包含的值... 我该怎么做?

【问题讨论】:

  • 您使用的是 C++11 编译器吗?如果是这样,我建议您改用 lambda 函数而不是仿函数并利用此功能。你很可能会更容易地以这种方式实现你想要实现的目标。此外,名字以下划线开头也不是一件好事。
  • 这个std::sort(vec.begin(), vec.end(), _compare(i)); 不应该编译,因为_compare::operator() 需要vector&lt;double&gt;,而不是Descriptor!或者有没有将Descriptor 转换为vector&lt;double&gt; 的运算符?您似乎没有显示整个代码。
  • 参见此处:[cppreference[(en.cppreference.com/w/cpp/algorithm/sort)"Type1Type2 类型必须使得 RandomIt 类型的对象可以被取消引用然后隐式转换给他们俩。"
  • PaulMcKenzie 我使用下划线作为仅用于其他函数的函数 :) 我不确定 lambda 这次能否帮助我 ^^ Iksemyonov 我的问题确实存在,但我我认为我很愚蠢,因为解决方案很简单。我已经用了 6 天了,我可能累了 :p 谢谢你!

标签: c++ sorting vector std


【解决方案1】:

您的比较器不正确 - 因为您正在对 vector&lt;Descriptor&gt; 进行排序,所以它必须比较 Descriptor 而不是 vector&lt;double&gt; 的两个实例:

class _compare {
    int step;
public: 
     _compare(int s) : step(s) {}

    bool operator()(const Descriptor& d1, const Descriptor& d2) const {
        return d1.fv[step] < d2.fv[step];
    }
};

【讨论】:

  • 哦哦是的!我有点愚蠢,解决方案很明显!非常感谢 ! :)
猜你喜欢
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2022-08-18
  • 2018-05-16
  • 1970-01-01
  • 2016-04-03
相关资源
最近更新 更多