gpt4 book ai didi

c++ - 从指针有条件地初始化 std::vector

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

我正在与一些 C++ 代码交互,这些代码具有提供指针和对象大小的方法(一些我无法更改的专有库)。界面看起来像这样:

float *arrayPtr();
int arraySize();

我有一个类需要将其复制到 vector 中(以延长其生命周期)。在这个指针不是nullptr的场景下,构造函数相当简单(我需要复制数据来延长它的生命周期):

struct A {
std::vector<float> vec;
A(float *ptr, int size) : vec( ptr, std::next(ptr, size) ) {}
}

但是,当 ptrnullptr 时,我不确定如何最好地处理初始化。我可以默认初始化,然后将所有内容移动到构造函数主体,但感觉效率很低:

A(float *ptr, int size) {
if (ptr) {
vec = std::vector<float>( ptr, std::next(ptr, size));
}
}

还有其他选择吗?

ptr 是一个 nullptr 时,我希望将 vector 默认初始化为一个空 vector 。

编辑:

我突然想到我应该这样做:

A(float *ptr, int size) : vec( ptr ? std::vector<float>(ptr, std::next(ptr, size)) : std::vector<float>() ) {}

但也许有更好的形式??

最佳答案

这不一定“更好”(实际上我认为您的原始代码很好,因为 vector 的默认初始化实际上没有任何成本),但是当您需要为初始化程序执行一些逻辑时,您可以使用辅助函数:

struct A {
std::vector<float> vec;
A(float *ptr, int size) : vec( make_A_vector(ptr, size) ) {}

private:
static std::vector<float> make_A_vector(float const *begin, int size)
{
if ( size < 0 || (size > 0 && !begin) )
throw std::runtime_error("invalid array length for A");

if ( size == 0 )
return {};

return std::vector<float>(begin, begin + size);
}
};

另一种常见的设计是让你的类保持简单,并将构造逻辑完全放在一个自由函数中:

struct A
{
std::vector<float> vec;
};

inline A make_A(float const *ptr, int size)
{
// sanity check omitted for brevity
if ( size == 0 )
return A{};

return A{ std::vector<float>(ptr, ptr + size) };
}

这是一个基于经验的判断电话,关于什么会矫枉过正,什么会美观 :)

关于c++ - 从指针有条件地初始化 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58912943/

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