c ++中集合/容器的接口/超类

Jan*_*usz 10 c++ collections containers language-design interface

我来自Java世界,目前正在构建一个小型的c ++程序.我有一个对象做了一些工作,然后将工作的结果作为列表返回.

现在一天后,我改变了对象的行为,将结果保存在一个集合中,以避免容器中的重复.但我不能简单地返回集合,因为我在第一次使用了接口列表.是否有一个通用的容器接口,我可以用来指定我的对象的接口,忘记我在内部使用的容器类型?

目前我正在创建一个添加所有值的集合,然后从集合中创建一个列表:

return std::list<foo>(this->mySet.begin(), this->mySet.end())
Run Code Online (Sandbox Code Playgroud)

似乎有点奇怪.

Dar*_*rio 10

整个C++标准库包括它的容器 - 与Java不同 - 不是接口(继承,多态) - 而是基于模板(为了效率).

你可以在你的集合周围创建一个多态包装器,但这不是C++方式.

最简单的解决方案是使用某些类型别名来简化程序:

#include <iostream>
#include <list>
#include <vector>

using namespace std;

class Test {

private:
    typedef vector<int> Collection;

    Collection c;

public:

    typedef Collection::const_iterator It;

    void insert(int Item) {
        c.push_back(Item);
    }

    It begin() const { return c.begin(); }
    It end()   const { return c.end(); }

};

int main() {

    Test foo;

    foo.insert(23);
    foo.insert(40);

    for (Test::It i = foo.begin(); i != foo.end(); ++i)
        cout << *i << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您现在可以更改Collection-typedef而无需更改任何其他内容.(注意:如果您Collection公开,用户将能够引用您明确使用的类型)


Mar*_*ork 10

容器的概念由迭代器实现.
正如您所见,硬编码特定类型的容器可能不是您想要的.所以让你的类返回迭代器.然后,您可以重新使用conatiner迭代器.

class MyClass
{
    private:
        typedef  std::list<int>            Container;
    public:
        typedef  Container::iterator       iterator;
        typedef  Container::const_iterator const_iterator; 


        iterator        begin()        {return myData.begin();}
        const_iterator  begin() const  {return myData.begin();}

        iterator        end()          {return myData.end();}
        const_iterator  end()   const  {return myData.end();}

    private:
        Container   myData;
};
Run Code Online (Sandbox Code Playgroud)

现在当你将容器类型从std :: list更改为std :: set时,nobody需要知道.
此外,通过使用其他容器使用的标准名称,您的类开始看起来像STL中的任何其他容器.

注意:返回const_iterator的方法应该是const方法.