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方法.
归档时间: |
|
查看次数: |
5175 次 |
最近记录: |