gpt4 book ai didi

c++ - 使用分配器覆盖的数组支持 vector - 一个坏主意?

转载 作者:行者123 更新时间:2023-11-30 01:55:29 26 4
gpt4 key购买 nike

我最近再次开始使用 C++,之前我曾在 STL 不那么流行的日子里使用它。好吧,STL 很棒,但我需要将我的数组包装在一个 vector 中以利用 STL 的优点 - 无需复制任何内容。所以,我读了这个 SO 问题:

Wrapping dynamic array into STL/Boost container?

令人惊讶的是,大多数答案,包括被接受的答案,都没有提出一个实际产生 vector 的解决方案......我不知道,也许在 Java 世界生活了一段时间让我成为接口(interface)的粉丝。无论如何,one answer通过 IdanK 确实建议获取 vector “类”(而不是模板)来适应这一点——用使用后备数组的代码替换分配器。

我想知道为什么这不是一个广泛使用的解决方案,为什么它不是 STL 或 Boost 的一部分,为什么人们不链接到典型的实现。我没有注意到这种方法的危害吗?

最佳答案

没有,没有标准的转弯方式

int a[34];

进入

std::vector<int>

所以你可以把它传递给一个函数,比如

void f(const std::vector<int>& v);

然而,正如我所见,您有两个选择,要么在调用点使用 vector ,因为这是您最终需要使用的类型,而且它几乎在所有方面都优于原始数组。或者将函数修改为迭代器上的运算符:

template<typename Iter>
void f(Iter first, Iter last);

然后该函数可以与 vector、deques、sets 甚至原始数组一起使用,如下所示:

std::set<int> s { 1,2,3,4 };
std::vector<int> v { 1,2,3,4 };
int ar[4] { 1,2,3,4 };
f(begin(ar), end(ar));
f(begin(v), end(v));
f(begin(s), end(s));

不过,就我个人而言,我会同时执行这两种操作,在调用点使用 vector ,并更改您的 func 以在迭代器上运行以将其与特定容器分离。

并直接回答您的问题。

I'm wondering why this isn't a widely-used solution, why it's not part of STL or Boost, why people don't link to typical implemenation. Are detriments to this approach which I'm failing to notice?

这不是一个广泛迎合的问题,因为处理该问题的惯用方法是使用通用迭代器接口(interface)。 (看看容器的接口(interface),比如 std::vector::insert 它不需要 vector 而是一对迭代器)。

编辑:

如果您别无选择,那么您将不得不复制数据:

int arr[4];
//c++11
std::vector<int> v ( begin(arr), end(arr) );
//c++03
std::vector<int> v ( arr, arr+4 );

关于c++ - 使用分配器覆盖的数组支持 vector - 一个坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709919/

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