Создайте 2D-вектор из 2-х одномерных векторов - PullRequest
0 голосов
/ 25 мая 2020

Я новичок в векторах, и я пытаюсь заполнить 2D-вектор из 2-х одномерных векторов для координатных точек. У меня есть 2 таких вектора, где source_x и source_y содержат значения из файла:

std::vector<float,T<float>> pos_x(5); 
std::vector<float,T<float>> pos_y(5); 

for (int i = 0; i < 5 ; i++){
  pos_x[i] = i+1; //{1,2,3,4,5}
}
for (int i = 0; i < num ; i++){
   pos_y[i] = i+1 ; //{1,2,3,4,5}
} 

Я создал свой 2D-вектор следующим образом:

std::vector<std::vector<float, T<float>>> position; 
for (int i = 0; i < num ; i++){
    for (int j = 0; j < num ; i++){
         //Output expected: {{1,2,3,4,5},{1,2,3,4,5}}
         position[i][j] = //I'm confuse here 
    }
}

Я не уверен, как заполнить pos_x в позицию [i] и pos_y в позицию [j].

Спасибо

Ответы [ 3 ]

1 голос
/ 25 мая 2020

Итак, я предполагаю, что это

std::vector<std::vector<float>> position(num, std::vector<float>(2)); 
for (int i = 0; i < num ; i++){
     position[i][0] = pos_x[i];
     position[i][1] = pos_y[i];
}

Но я легко могу ошибаться.

ОБНОВЛЕНИЕ на основе примера в вопросе, теперь я думаю, что это правильный код

std::vector<std::vector<float>> position(2, std::vector<float>(num)); 
for (int i = 0; i < num ; i++){
     position[0][i] = pos_x[i];
     position[1][i] = pos_y[i];
}
0 голосов
/ 25 мая 2020

2D-вектора не существует. Дело в том, что вы можете создать вектор, содержащий векторы. Первый вектор используется в качестве индекса в собранных векторах.

Обратите внимание, что эта концепция аналогична 2D-массиву: arr[3][4] означает 3 индекса, каждый из которых указывает на 4 данных.

Чтобы создать такой 2D-вектор:

std::vector< std::vector <float>> positions.

Обратите внимание, что я не использовал второй параметр (как в std::vector<float, SomeAllocator>, потому что нам не нужен этот специальный распределитель памяти.

Также обратите внимание, что в отличие от массивов, я ничего не сказал о размерах каждого вектора, потому что std :: vector позаботится об этом.

Давайте заполним его.

"main" вектор содержит векторы. Таким образом, эти вторичные векторы могут быть созданы перед сохранением в «основном».

std::vector<float> v1; //secondary
positions.push_back(v1); //add it to main vector

Поместите некоторые значения во вторичный:

v1.push_back(7.5);
v1.push_back(-3.1);

Другой способ - получить доступ через главный вектор. Если мы создадим новый, этот главный вектор содержит v1 в своем первом индексе:

positions[0].push_back(8.); // same as v1.push_back(8.) if positions[0] refers to v1

или лучше, используя "at": positions.at(0).push_back(8.);

Измените какое-то значение:

v1.at(1) = 66.88;

или

positions[0].at(1) = 66.88;

Вы также можете использовать v1[1] = 66.88, но предпочитаете метод at() потому что он проверит, что индекс "1" разрешен размером вектора v1.

Вы можете создать и добавить еще один вторичный вектор:

std::vector<float> v2; //secondary
positions.push_back(v2); //add it to main vector

и работать с ним так же, как с предыдущим v1. Теперь positions[1] относится к v2

Остальную часть работы с другими векторами оставляю вам.

0 голосов
/ 25 мая 2020

Вы можете сделать это:

struct coordinate {
    float x;
    float y;
};

затем

int main() {
    vector<pos> positions;

    //add new position
    for (int i = 0; i < num; i++) {
        //               this below in the "{" and "}" is the coordinate
        positions.push_back( {(float)source_x[i], (float)source_y[i]} );
    }
}

Но если вы действительно хотите сделать это с 2-мерным вектором, сделайте это:

position.push_back(pos_x);
position.push_back(pos_y);

И вы можете удалить l oop. Чтобы получить доступ к x, выполните

position[0][ind]

, чтобы получить доступ к y, выполните

positions[1][ind]

Окончательный вектор будет выглядеть примерно так:

position[0]: {x0, x1, x2, x3, ...}
position[1]: {y0, y1, y2, y3, ...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...