当前位置:  开发笔记 > 编程语言 > 正文

扩展std :: list

如何解决《扩展std::list》经验,为你挑选了5个好方法。

我需要为我的程序使用列表,并需要决定是否使用std :: vector或std :: list.向量的问题在于没有删除方法,并且列表中没有运算符[].所以我决定编写自己的类来扩展std :: list并重载[]运算符.

我的代码看起来像这样:

#include 

template 
class myList : public std::list
{
public:
T operator[](int index);
T operator[](int & index);
myList(void);
~myList(void);
};

#include "myList.h"

template
myList::myList(void): std::list() {}

template
myList::~myList(void)
{
std::list::~list();
}

template
T myList::operator[](int index) {
int count = 0;
std::list::iterator itr = this->begin();
while(count != index)itr++;
return *itr;    
}

template
T myList::operator[](int & index) {
int count = 0;
std::list::iterator itr = this->begin();
while(count != index)itr++;
return *itr;
}

我可以编译它,但如果我尝试使用它,我会收到链接器错误.有任何想法吗?



1> Johannes Sch..:

根据您的需要,您应该使用std::vector(如果您需要经常在最后添加/删除,并随机访问),或者std::deque(如果您需要经常在结尾或开头添加/删除,并且您的数据集很大,仍然想要随机访问).这是一张很好的图片,向您展示如何做出决定:

集装箱选择
(来源:adrinael.net)



2> ChrisN..:

鉴于你原来的问题陈述,

我需要为我的程序使用列表,并需要决定是否使用std :: vector或std :: list.向量的问题在于没有删除方法,并且列表中没有运算符[].

没有必要创建自己的列表类(这不是一个明智的设计选择,因为std::list没有虚拟析构函数,这是一个强烈的迹象,它不打算用作基类).

您仍然可以实现您想要std::vectorstd::remove功能和功能.如果v是a std::vector,那么要删除该值value,您只需编写:

#include 
#include 
T value = ...; // whatever
v.erase(std::remove(v.begin(), v.end(), value), v.end());


如果您知道要擦除的元素索引,例如v [3],您还可以使用v.erase(v.begin()+ 3).随机访问迭代器和所有......

3> Drakosha..:

所有模板代码都应放在头文件中.这个填充修复链接问题(这是最简单的方法).它发生的原因是因为编译器将每个源(.cc)文件与其他文件分开编译.另一方面,它需要知道它需要创建什么样的代码(即模板中的T被替换为什么),除非程序员明确地告诉它或者包含模板中的所有代码,否则没有其他方法可以知道它.实例化发生了.也就是说,当编译mylist.cc时,它对mylist用户一无所知,需要创建什么代码.另一方面,如果编译了listuser.cc,并且存在所有的mylist代码,则编译器会创建所需的mylist代码.您可以在这里或Stroustrup中阅读更多相关信息.

您的代码有问题,如果用户请求负数或太大(超过列表中的元素数量)会怎样.而且我看起来并不太多.

此外,我不知道你打算如何使用它,但你的运算符[]是O(N)时间,这可能很容易导致O(N*N)循环......



4> Sydius..:

向量具有可以移除元素的擦除方法.这还不够吗?



5> Nemanja Trif..:

除了其他优秀的注释之外,扩展标准容器的最佳方法不是通过派生,而是编写自由函数.例如,看看Boost字符串算法如何用于扩展std::string和其他字符串类.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有