gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:35:26 26 4
gpt4 key购买 nike

稍微使用 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++ 库?这样的想法有什么问题吗?

最佳答案

除非您尝试以多态方式删除 vector ,否则这个想法在继承上没有任何错误。

例如:

auto myvec = new MyVector<int>;
std::vector<int>* myvecbase = myvec;

delete myvecbase; // bad! UB
delete myvec; // ok, not UB

这是不寻常的,但仍然可能是错误的来源。

但是,我仍然推荐它。

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

例如考虑这段代码:

// 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();

此外,它仅适用于 vector ,而我可以看到将这些功能与其他容器类型一起使用的实用程序。


我的建议是让你提议的功能免费——不要让它们成为你的 vector 子类的成员。这将使它们与任何实例或引用一起工作,并且还可以与其他容器类型重载。这将使您的代码更加标准(不使用您自己的容器集)并且更易于维护。

如果您觉得需要为容器类型实现许多功能样式实用程序,我建议您寻找一个可以为您实现它们的库,即 ranges-v3 ,正在走向标准化。


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

此外,有时我碰巧存储了特定数量的相同类型的元素,这些元素在编译时可能会有所不同。我确实扩展了 std::array(私下)以简化实现。

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

关于c++ - 扩展 std::vector 是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com