Проблема с классом сравнения STL Set - PullRequest
0 голосов
/ 21 июня 2011

У меня есть набор с идентификаторами, например {3,7,1,5}. Я хотел бы иметь 7 до 1, когда таблица [7] <таблица [1]. Я сделал это так: </p>

  • У меня есть класс (MyClass1), который имеет два члена: таблицу векторов и operator ()
  • operator () возвращает true, когда таблица [a] <таблица [b] </li>
  • в другом классе (MyClass2) я установил MySet1
  • Я использую MySet1.insert () внутри членов MyClass2

Но ... кажется, что operator () не имеет доступа к таблице, потому что table [a] или table [b] вызывает segfault, а table.size () всегда возвращает 0 (даже если таблица не пуста) конечно).

Что мне делать?

1 Ответ

0 голосов
/ 21 июня 2011

Возможно, этот маленький образец помогает

#include <map>
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>

typedef int sortkey_t;
typedef std::map<int, sortkey_t> lookup_t;

struct by_sort_lookup
{
    by_sort_lookup(const lookup_t& table) : _table(table) {}

    bool operator()(int a, int b) const
    {
        lookup_t::const_iterator ai = _table.find(a);
        lookup_t::const_iterator bi = _table.find(b);

        if (ai==bi)           return false;
        if (ai==_table.end()) return false; // choose some
        if (bi==_table.end()) return true;  // complementary
        return (ai->second) < (bi->second);
    }
  private:
    const lookup_t& _table;
};

int main()
{
    std::map<int, sortkey_t> sortkey_by_id;

    sortkey_by_id[1] = 70;
    sortkey_by_id[2] = 60;
    sortkey_by_id[3] = 80;

    //
    std::vector<int> ids;
    ids.push_back(1);
    ids.push_back(3);
    ids.push_back(2);

    std::cout << "before sorting: " << std::endl;
    std::copy(ids.begin(), ids.end(), std::ostream_iterator<int>(std::cout, "\r\n"));

    std::sort(ids.begin(), ids.end(), by_sort_lookup(sortkey_by_id));

    std::cout << "after sorting: " << std::endl;
    std::copy(ids.begin(), ids.end(), std::ostream_iterator<int>(std::cout, "\r\n"));
}
...