代码之家  ›  专栏  ›  技术社区  ›  sethu

一种具有排序功能的有效数据结构

  •  5
  • sethu  · 技术社区  · 14 年前

    struct dbdetails
    {
        int id;
        string val;
    };
    

    我需要C++中的一个数据结构,它可以用一个排序能力来保存结构变量。有可能吗?我在看vector,它可以保存结构变量,但是我不能基于id对它进行排序,因为它是一个结构成员。有什么建议吗?

    6 回复  |  直到 9 年前
        1
  •  6
  •   Matteo Italia    14 年前

    你需要一个自定义函子来比较你的尝试。这应该可以做到:

    #include <algorithm>
    #include <vector>
    // try is a keyword. renamed
    struct sorthelper : public std::binary_function<try_, try_, bool>
    {
        inline bool operator()(const try_& left, const try_& right)
        {   return left.id < right.id;  }
    };
    
    ...
    std::vector<try_> v;
    // fill vector 
    std::sort(v.begin(), v.end(), sorthelper());
    ...
    

    编辑:马特奥的建议:

    struct try_
    {
        int id;
        string val;
        bool operator<(const try_& other) const
            {return id < other.id;}
    
    }; // no s here plz.
    
    ...
    std::vector<try_> v;
    // fill vector 
    std::sort(v.begin(), v.end());
    ...
    
        2
  •  4
  •   Nate    14 年前

    你需要一个 std::map

    std::map<int, std::string> myStuff;
    

    int 作为关键和 std::string

    struct 结构 (可能是为了与某个外部库接口)您始终可以从 map 变成一个 结构 根据需要。

        3
  •  1
  •   codaddict    14 年前

    vector struct ,然后将其排序为:

    std::sort(vectStruct.begin(), vectStruct.end(), &vectStructSort);
    
    bool vectStructSort(Try const& lhs, Try const& rhs) { // try is keyword.
        return lhs.id < rhs.id;
    }
    
        4
  •  1
  •   vulkanino    14 年前

    这取决于您对数据容器的要求。

        5
  •  1
  •   David Rodríguez - dribeas    14 年前

    std::set , std::map std::multiset std::multimap std::list , std::vector , std::deque )可以通过使用 std::sort (vector,deque)或通过将该比较器提供给成员方法(list)。

    一切归根结底都是你真正需要的。如果需要始终对元素进行排序,则排序后的容器可能比修改容器和重新排序更有效。另一方面,如果不需要一直对容器进行排序,但是可以修改元素,那么您可能更喜欢向量。排序容器将键保持为常量对象,因为修改键会破坏排序不变性。

    在某些情况下,需要随时对容器进行排序,但在某些初始化阶段之后,它不会更改。在这种情况下,初始化后进行排序的未排序容器就可以了。

        6
  •  0
  •   Laurence Gonsalves    14 年前