1

不幸的是,我不能使用 C++11 或 Boost。

我有一些如下代码

struct Cell
{
    Cell(int value) : value(value) {}

    int value;

    bool CompareValue(const Cell& other) const
    {
        return this->value < other.value;
    }
};

int main()
{
    const int size = 10;
    vector<Cell> cells;
    for (int i = 0; i < size; i++)
    {
        cells.push_back(Cell(rand()));
        cout << "[ " << cells.back().value << " ] ";
    }
    cout << "\n\n";

    int maxvalue = max_element(cells.begin(), cells.end(), mem_fun_ref(&Cell::CompareValue))->value;
    int minvalue = min_element(cells.begin(), cells.end(), mem_fun_ref(&Cell::CompareValue))->value;

    cout << "Max = " << maxvalue << "\n" << "Min = " << minvalue << "\n";
}

但是现在我需要扩展比较功能来进行比较模式

bool CompareValue(const Cell& other, MODE_T mode) const
{
    switch (mode)
    {
        ...
    }
}

但是,我无法弄清楚如何更新 max_element 的使用以使用这个新功能。每次比较运行的模式参数都是相同的。我尝试使用各种绑定和东西,但无济于事。任何帮助表示赞赏。

4

1 回答 1

0

你可以写functor,那会做这样的事情。

struct CompareCellWithMode : public std::binary_function<Cell, Cell, bool>
{
public:
   result_type CompareCellWithMode
   (const first_argument_type& f, const second_argument_type& s)
   {
      return f.CompareValue(s, mode);
   }
private:
   MODE_T mode;
};

MODE_T mode;
int maxvalue = max_element(cells.begin(), 
cells.end(), CompareCellWithMode(mode))->value;

或与std::tr1::bind

MODE_T mode;
int maxvalue = max_element(cells.begin(), cells.end(), 
std::tr1::bind(&Cell::CompareValue, _1, mode))->value;
于 2013-06-21T13:51:47.697 回答