首页 > 解决方案 > 从 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;
          
     

标签: c++arraysvector

解决方案


使用数组,您可以在创建它时指定大小。它不会随着您添加而增长。您实际上并没有添加它;您只需设置特定元素的值。

当您编写: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;

请注意,数组的实际大小将保持您在创建它们时指定的大小,但您将拥有一个包含所需信息的附加变量——实际使用的元素数。此外,您将始终使用数组的第一部分,将未使用的条目留在最后,这样更易​​于使用。


推荐阅读