C++ sqlselect通常是如何实现的

C++ sqlselect通常是如何实现的,c++,select,C++,Select,我有两节课 class PopulationMember { public: void operationOnThisMember1(); void operationOnThisMember2(); ... private: Population* populaltion_; } class Population { public: void operationOnAllMembers1(); void operationOnAllMemb

我有两节课

class PopulationMember
{
public:
    void operationOnThisMember1();
    void operationOnThisMember2();
    ...

private:

    Population* populaltion_;
}

class Population
{
public:
    void operationOnAllMembers1();
    void operationOnAllMembers2();
    ...
    void operationOnAllMembers100();

    void sortAllMembersCriterium1();
    void sortAllMembersCriterium2();
    ...
    void sortAllMembersCriterium100();

private:
    QVector<PopulationMember*> members_;
}
  • 添加

    bool selected_; 
    
    标记到每个PopulationMember

  • 如果我做了1。无法对所选数据进行排序和删除。如果我做2。检查选择性会带来开销,我必须重新实现排序和其他算法,才能只对选定的成员进行操作


    还有第三种更好的方法吗?

    我将采取的方法是向整个集合公开迭代器接口。为了实现某种选择,我将使用迭代器适配器,例如,一元谓词适配器,它提供了范围的新视图。这样,在创建单独的集合时既不会影响存储对象,也不会产生任何开销。如果您看看Boost的迭代器适配器,您可能已经获得了所需的大部分功能。

    我将采取的方法是向整个集合公开迭代器接口。为了实现某种选择,我将使用迭代器适配器,例如,一元谓词适配器,它提供了范围的新视图。这样,在创建单独的集合时既不会影响存储对象,也不会产生任何开销。如果您查看Boost的迭代器适配器,您可能已经获得了所需的大部分内容。

    我从未看过,但我希望它将是方法1。请参阅以确认我的期望值。:-)

    我从来没有看过,但我希望是方法1。请参阅以确认我的期望值。:-)

    这是一个基于类似我曾经做过的事情的建议,这是您第一种方法的扩展形式。 优点是使用STL的概念,并且可以自由地实现许多函子或很少的可参数化函子

    class All
    {
    public:
        bool operator()(const PopulationMember* entity) const
        {
            return true;
        }
    };
    
    class AscByID
    {
    public:
        bool operator()(const PopulationMember* a, const PopulationMember* b) const
        {
            return a->getId() < b.getId();
        }
    };
    
    template<typename Entity, class Predicate, class SortComparator>
    class Query
    {
    public:
        typedef std::set<Entity, SortComparator> ResultSet;
    
        Query(const Predicate& predicate = Predicate(), const SortComparator& cmp = SortComparator()) :
                predicate(predicate), resultSet(cmp)
        {
        }
    
        bool operator()(const Entity& entity)
        {
            if (predicate(entity))
            {
                resultSet.insert(entity);
                return true;
            }
            return false;
        }
    
        const ResultSet& getResult(void) const
        {
            return resultSet;
        }
    
        void clearResult(void)
        {
            resultSet.clear();
        }
    private:
        Predicate predicate;
        ResultSet resultSet;
    };
    
    int main()
    {
        Query<const PopulationMember*, All, AscByID> query;
    
        Popuation::execute(query);
        //do something with the result
        query.getResult();
        //clear the result
        query.clearResult();
        //query again
        Popuation::execute(query);
        //do something useful again
        return 0;
    }
    
    全部分类
    {
    公众:
    布尔运算符()(常量填充成员*实体)常量
    {
    返回true;
    }
    };
    类AscByID
    {
    公众:
    布尔运算符()(常量填充成员*a,常量填充成员*b)常量
    {
    返回a->getId()
    这是一个基于类似我曾经做过的事情的建议,这是您第一种方法的扩展形式。 优点是使用STL的概念,并且可以自由地实现许多函子或很少的可参数化函子

    class All
    {
    public:
        bool operator()(const PopulationMember* entity) const
        {
            return true;
        }
    };
    
    class AscByID
    {
    public:
        bool operator()(const PopulationMember* a, const PopulationMember* b) const
        {
            return a->getId() < b.getId();
        }
    };
    
    template<typename Entity, class Predicate, class SortComparator>
    class Query
    {
    public:
        typedef std::set<Entity, SortComparator> ResultSet;
    
        Query(const Predicate& predicate = Predicate(), const SortComparator& cmp = SortComparator()) :
                predicate(predicate), resultSet(cmp)
        {
        }
    
        bool operator()(const Entity& entity)
        {
            if (predicate(entity))
            {
                resultSet.insert(entity);
                return true;
            }
            return false;
        }
    
        const ResultSet& getResult(void) const
        {
            return resultSet;
        }
    
        void clearResult(void)
        {
            resultSet.clear();
        }
    private:
        Predicate predicate;
        ResultSet resultSet;
    };
    
    int main()
    {
        Query<const PopulationMember*, All, AscByID> query;
    
        Popuation::execute(query);
        //do something with the result
        query.getResult();
        //clear the result
        query.clearResult();
        //query again
        Popuation::execute(query);
        //do something useful again
        return 0;
    }
    
    全部分类
    {
    公众:
    布尔运算符()(常量填充成员*实体)常量
    {
    返回true;
    }
    };
    类AscByID
    {
    公众:
    布尔运算符()(常量填充成员*a,常量填充成员*b)常量
    {
    返回a->getId()
    选择
    不是用于过滤,而是用于投影。请问,投影到底是什么意思?我想实现过滤功能。投影基本上是将结构A转换为结构B(其中A和B可能是相同的结构,但通常不是)。例如,
    从“表”
    中选择“a”以排除所有其他列。SQL
    SELECT
    语法始终需要投影<代码>从“表”中选择*在概念上是一种无净效果的投影。过滤是SQL查询的
    部分,其中
    是SQL查询的一部分。
    SELECT
    不是用于过滤,而是用于投影。请问,投影到底是什么意思?我想实现过滤功能。投影基本上是将结构A转换为结构B(其中A和B可能是相同的结构,但通常不是)。例如,
    从“表”
    中选择“a”以排除所有其他列。SQL
    SELECT
    语法始终需要投影<代码>从“表”中选择*
    在概念上是一种无净效果的投影。过滤是SQL查询的
    部分,其中