扩展std :: vector是个好主意吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扩展std :: vector是个好主意吗?相关的知识,希望对你有一定的参考价值。

javascript略微合作,我意识到与C++相比,开发速度更快,因为.begin()因为通常不适用的原因而减慢了写作速度。总是通过我所有应用程序发生的.end()std::vector并不舒服。

我正在考虑扩展javascript(更多是通过封装而不是继承),这几乎可以遵循.filter([](int i){return i>=0;}) .indexOf(txt2) .join(delim) .reverse() 方法的惯例,如

auto it = std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar), [](int i){return i>=0;} );

ptrdiff_t pos = find(Names.begin(), Names.end(), old_name_) - Names.begin();

copy(elems.begin(), elems.end(), ostream_iterator<string>(s, delim)); 

std::reverse(a.begin(), a.end());

代替

C++

但是,我想知道这是不是一个好主意,为什么没有auto myvec = new MyVector<int>; std::vector<int>* myvecbase = myvec; delete myvecbase; // bad! UB delete myvec; // ok, not UB 库这种常见的日常功能?这样的想法有什么问题吗?

答案

除非您尝试以多态方式删除矢量,否则这个想法没有任何遗传错误。

例如:

// Code not in your control:
std::vector<int>& get_vec();

// error! std::vector doesn't have reverse!
auto reversed = get_vec().reverse();

// Works if you copy the vector to your class
auto copy_vec = MyVector<int>{get_vec()};
auto reversed_copy = copy_vec.reverse();

这很不寻常,但仍可能是错误的根源。

但是,我仍然不推荐它。

要获得增加的功能,您必须拥有自己的矢量实例,这意味着您必须复制或移动任何其他现有矢量到您的类型。它不允许您使用函数引用向量。

例如,考虑以下代码:

ranges-v3

此外,它只适用于矢量,而我可以看到实用程序与其他容器类型具有这些功能。


我的建议是让你的建议函数免费 - 不要让它们成为你孩子类的向量。这将使它们适用于任何实例或引用,并且还可以与其他容器类型一起使用。这将使您的代码更加标准(不使用您自己的容器集)并且更容易维护。

如果您觉得需要为容器类型实现许多这些功能样式实用程序,我建议您寻找一个为您实现它们的库,即std::tuple,它正在进行标准化。


在论证的另一方面,有继承STL类的有效用例。例如,如果您处理通用代码并希望存储可能为空的函数对象,则可以从std::array(私有)继承以利用空基类优化。

此外,在某些时候我发生了存储特定数量的相同类型的元素,这些元素在编译时可能会有所不同。我做了扩展template<typename container > class wrapper{ public: wrapper(container const& c) : c_( c ){} wrapper& reverse() { std::reverse(c_.begin(), c_.end()); return *this; } template<typename it> wrapper& copy( it& dest ) { std::copy(c_.begin(), c_.end(), dest ); return *this; } /// ... private: container c_; }; (私人)以简化实施。

但请注意这两种情况:我使用它们来简化通用代码的实现,并且我私下继承它们,它们不会将继承暴露给其他类。

另一答案

包装器可用于创建更流畅的API。

std::vector<int> ints{ 1, 2, 3, 4 };

auto w = wrapper(ints);    
auto out = std::ostream_iterator<int>(std::cout,", ");

w.reverse().copy( out );

然后包装器可用于“美化”代码

here

查看工作版qazxswpoi。

以上是关于扩展std :: vector是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

在哪里使用“std::valarray”是个好主意?

Cassandra Scaling:为多节点 Cassandra DB 使用通用挂载是个好主意吗?

typedef 指针是个好主意吗?

在后台线程上为 NSFetchedResultsController 执行 fetch 是个好主意吗?

为 UI 的一部分创建另一个流程是个好主意吗?

软删除是个好主意吗? [复制]