扩展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是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章
Cassandra Scaling:为多节点 Cassandra DB 使用通用挂载是个好主意吗?