gpt4 book ai didi

C++11 - 从函数传递向量作为迭代器

转载 作者:行者123 更新时间:2023-12-02 04:54:52 24 4
gpt4 key购买 nike

这可能是一个简单的问题,但是却让我很困惑。

我有一个返回填充向量的类成员:

vector<double> returnVector()
{
return theVector;
}

我还有一个名为 toArray() 的函数,它接受一个迭代器,这样我就可以在传入的值的类型之间进行切换。例如:

template<typename T, typename Inverse>
T* toArray(Inverse begin, Inverse end)
{
size_t size = distance(begin, end);
auto pos = 0;

T* tmp = new T[size];

for(auto i = begin; i != end; i++)
{
tmp[pos] = *i;
pos++;
}
return tmp;

}

在我的 main 中,我认为可以执行以下操作;

MyClass class; 

auto* var = Functs::toArray<double>(
std::begin(class.returnVector()),
std::end(class.returnVector())
);

然而,这不起作用,我似乎遇到了一些 malloc 错误。但是,我可以执行以下操作:

MyClass class;

vector<double> vals = class.returnVector();
auto* var = Functs::toArray<double>(
std::begin(vals),
std::end(vals)
);

谁能解释为什么会这样?我假设因为函数 returnVector 返回实际向量,因此可以从 begin 访问到 end

最佳答案

这里:

Functs::toArray<double>(
std::begin(class.returnVector()),
std::end(class.returnVector())
);

您的returnVector 方法按值返回,所以您得到一个副本。这意味着这两个调用会产生两个不同 向量。这就是为什么您获得的范围比您预期的大得多,以及为什么您最终访问无效内存的原因。

如果可以,请更改 returnVector 以返回引用。但如果这不是一个选项,您只需要记住始终存储对它的本地引用,就像您在其他示例中所做的那样。

另一种选择是定义一个方便的重载:

template<typename T>
T* toArray(std::vector<T>& vec) {
return toArray( std::begin( vec ), std::end( vec ) );
}

你可以这样调用:

auto* var = Functs::toArray( class.returnVector() );

就我个人而言,我会选择该选项。

关于C++11 - 从函数传递向量作为迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166943/

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