c++ - 从 std::vector 转换为 std::array
问题描述
我试图在我的代码中使用 std::arrays 而不是 std::vectors 。但是失败了,这个使用向量的代码可以正常工作
void split_dataset(int fold, vector<vector<int>>& vec_X_dataset, vector<int>& vec_Y_dataset,
vector<vector<int>>& vec_X_train, vector<int>& vec_Y_train,
vector<vector<int>>& vec_X_test, vector<int>& vec_Y_test) {
size_t len = vec_X_dataset.size(); //5430
size_t division = static_cast<size_t>(len / 5); //1086
switch (fold) {
case 1:
for (size_t i = 0; i < len; ++i) {
if (i < division) {
vec_X_test.push_back(vec_X_dataset[i]);
vec_Y_test.push_back(vec_Y_dataset[i]);
}
else {
vec_X_train.push_back(vec_X_dataset[i]);
vec_Y_train.push_back(vec_Y_dataset[i]);
}
}
break;
但是当尝试使用 std::arrays 而不是向量时,它会给我错误的结果......这是我遇到问题的代码:
void split_dataset(int fold, array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset,
array<array<int, 20>, 5430>& array_X_train, array<int, 5430>& array_Y_train,
array<array<int, 20>, 5430>& array_X_test, array<int, 5430>& array_Y_test) {
size_t len = array_X_dataset.size(); //5430
size_t division = static_cast<size_t>(len / 5); //1086
// cout << "len = " << len << " divisoin = " << division;
switch (fold) {
case 1:
for (size_t i = 0; i < len; ++i) {
if (i < division) {
// vec_X_test.push_back(vec_X_dataset[i]);
//vec_Y_test.push_back(vec_Y_dataset[i]);
array_X_test[i] = array_X_dataset[i];
array_Y_test[i] = array_Y_dataset[i];
}
else {
//vec_X_train.push_back(vec_X_dataset[i]);
//vec_Y_train.push_back(vec_Y_dataset[i]);
array_X_train[i] = array_X_dataset[i];
array_Y_train[i] = array_Y_dataset[i];
}
}
break;
这是主要功能:
int main()
{
static array<array<int, 20>, 5430> array_X_train {};
static array<int, 5430> array_Y_train {};
static array<array<int, 20>, 5430> array_X_test {};
static array<int, 5430> array_Y_test {};
int fold;
cout << "plz cin fold" << endl;
cin >> fold;
split_dataset(fold, array_X_dataset, array_Y_dataset, array_X_train, array_Y_train, array_X_test, array_Y_test);
cout << endl << endl << "size of array_X_dataset=" << array_X_dataset.size() << endl;
cout << "size of array_Y_dataset=" << array_Y_dataset.size() << endl;
cout << "size of train_x_dataset in fold " << fold << " =" << array_X_train.size() << endl;
cout << "size of test_x_dataset in fold " << fold << " =" << array_X_test.size() << endl << endl << endl;
解决方案
使用数组,您可以在创建它时指定大小。它不会随着您添加而增长。您实际上并没有添加它;您只需设置特定元素的值。
当您编写:array_X_test[i] = array_X_dataset[i];
或array_X_train[i] = array_X_dataset[i]
时,您将元素设置在 location i
。因此,对于“测试”数组,您将值放在您期望它们的位置(因为i
您在这里使用的值从零开始),但对于“火车”数组,您不是。您从 开始执行此操作division
,因此您放入“train”数组的第一个元素正在执行此操作:array_X_train[division] = array_X_dataset[division]
您可能希望为每个数组分别保留一个单独的变量来表示元素数量(这也是您将使用的下一个索引)。就像是:
void split_dataset(int fold, array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset,
array<array<int, 20>, 5430>& array_X_train, array<int, 5430>& array_Y_train,
array<array<int, 20>, 5430>& array_X_test, array<int, 5430>& array_Y_test) {
size_t len = array_X_dataset.size(); //5430
size_t division = static_cast<size_t>(len / 5); //1086
// cout << "len = " << len << " divisoin = " << division;
int num_elements_in_test = 0;
int num_elements_in_train = 0;
switch (fold) {
case 1:
for (size_t i = 0; i < len; ++i) {
if (i < division) {
array_X_test[num_elements_in_test ] = array_X_dataset[i];
array_Y_test[num_elements_in_test ] = array_Y_dataset[i];
num_elements_in_test++;
}
else {
array_X_train[num_elements_in_train ] = array_X_dataset[i];
array_Y_train[num_elements_in_train ] = array_Y_dataset[i];
num_elements_in_train++;
}
}
break;
请注意,数组的实际大小将保持您在创建它们时指定的大小,但您将拥有一个包含所需信息的附加变量——实际使用的元素数。此外,您将始终使用数组的第一部分,将未使用的条目留在最后,这样更易于使用。
推荐阅读
- spring - 注入接口并识别具体类
- google-apps-script - 是否可以将谷歌照片元数据加载到谷歌表格中?
- php - 如何处理来自不同输入名称的多个文件并从数据库最后插入的 ID 重命名
- java - 在 LIMIT 子句中出现预期的错误非负整数值
- c# - Text7 PDF 操作:Y 页 X - 未找到错误预告片
- c# - 如何获取静态变量的组件?
- google-analytics - Analytics API:我无法在我的 PC 上使用两个不同的 API 凭据
- delphi - GdipDrawLine 的奇怪行为
- spring-boot - 无法完成请求:java.io.IOException: Stream closed from Spring boot Controller method
- python - Pandas 使用字典键值增量更新/向行添加列