gpt4 book ai didi

c++ - 如何在 C++ 中将二维 vector 转换为一维数组?

转载 作者:行者123 更新时间:2023-11-27 23:39:32 26 4
gpt4 key购买 nike

我需要能够在不使用 C++ 智能指针的情况下执行此操作。我尝试了以下

double* VecToArr(std::vector<std::vector<double>> vec) {
double* newarr=new double(vec.size());
for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), newarr);
newarr += vec[i].size();
}
std::cout<<"inside \n";
for (int i=0; i<vec.size(); i++) {
std::cout<<newarr[i]<<"\n";
}
return newarr;
}

int main(){
std::vector<double> x{1,2};
std::vector<double> y{3,4};
std::vector<std::vector<double>>vec;
vec.push_back(x);
vec.push_back(y);
double *arr=VecToArr(vec);
std::cout<<"outside \n";
for (int i=0; i<4; i++) {
std::cout<<arr[i]<<"\n";
}
}

但是在 VecToArr 中,输出是:

inside
4.54e-322 2.18e-317 4.34e-311 4.24e-314

不像我预期的那样 1 2 3 4

在它之外,我得到了相同的垃圾值。这是为什么?

此外,由于我使用 newVecToArr 中创建了 newarr,我该如何删除 它呢?在 main.cpp 中,打印出值后,是否只执行 delete arr[]

编辑

当我将函数更改为:

double* VecToArr(std::vector<std::vector<double>> vec) {
double* newarr=new double[vec.size()*vec[0].size()];
for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), newarr);
newarr += vec[i].size();
}
std::cout<<"inside \n";
for (int i=0; i<vec.size(); i++) {
std::cout<<newarr[i]<<"\n";
}
return newarr;
}

现在的输出是 3 4 (garbage) (garbage) 而不是 1 2 3 4

最佳答案

三个主要问题正如其他人在评论中提到的那样,还有更多。首先,您使用了错误类型的 new 表达式,new double(...) 只是为单个 double 分配内存并使用所提供的值对其进行初始化。您可能希望 new double[...] 分配一个 double 组。

其次,提供给这个 new 的大小不正确,只代表 vector 的第一维(当它需要是所有嵌套 vector 大小的总和时)。

最后,您将返回 newarr,它已被函数内的 for 循环修改并最终指向分配发生后的内存,您可能想要在开始时创建它的临时拷贝并返回它。

经过所有更改,最终正确的函数可能如下所示:

double* VecToArr(std::vector<std::vector<double>> vec) {
std::size_t totalsize = 0;

for (int i=0; i<vec.size(); i++) {
totalsize += vec[i].size();
}

double* newarr=new double[totalsize];
double* walkarr=newarr;

for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), walkarr);
walkarr += vec[i].size();
}

return newarr;
}

我还建议通过常量引用传递 vector ,因为目前它是按值传递的(目前)没有任何原因,这可能会导致不必要的开销。此外,您应该尝试始终使用类似 std::vector 的东西(或至少是智能指针)来分配内存,而不是使用 new/delete 直接(除非处理低级容器实现),因为通常没有太多理由以打开程序导致内存泄漏为代价。

关于c++ - 如何在 C++ 中将二维 vector 转换为一维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56450161/

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