STL Set比较类的问题

发布于 2024-11-16 22:30:09 字数 391 浏览 0 评论 0原文

我有一组 ID,例如 {3,7,1,5}。当 table[7] < 时,我想在 1 之前有 7。表[1]。我是这样做的:

  • 我有一个类(MyClass1),它有两个成员:向量表和operator()
  • 当table[a] <时,operator()返回true。 另一个类(MyClass2)中的表[b]
  • 我已经设置了<无符号整数,MyClass1> MySet1
  • 我在 MyClass2 的成员中使用 MySet1.insert()

但是......似乎运算符()无权访问表,因为 table[a] 或 table[b] 导致段错误,并且 table.size() 总是返回 0(当然,即使表不为空)。

我应该怎么办?

I have a set with IDs, for example {3,7,1,5}. I'd like to have 7 before 1, when table[7] < table[1]. I've done it this way:

  • I have a class (MyClass1), which has two members: vector table and operator()
  • operator() returns true, when table[a] < table[b]
  • in another class (MyClass2) i have set < unsigned int, MyClass1 > MySet1
  • I use MySet1.insert() inside members of MyClass2

But... seems that an operator() doesn't have access to table, because table[a] or table[b] causes segfault, and table.size() always return 0 (even when table is not empty of course).

What should I do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

∞觅青森が 2024-11-23 22:30:09

也许这个小样本有帮助

#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"));
}

Perhaps this little sample helps

#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"));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文