Я думаю, что вы хотели сделать следующее:
void get_row(int r, const std::vector<int>& in, std::vector<int>& out) {
int rowlength = std::sqrt(in.size());
std::vector<std::vector<int>> temp; // now a 2D vector (vector of vectors)
for(int i = 0; i < rowlength; i++) {
temp.emplace_back(); // for each row, we need to emplace it
for(int j = 0; j < rowlength; j++) {
// we need to copy every value to the i-th row
temp[i].push_back(in[twod_to_oned(i, j, rowlength)]);
}
}
for(int j = 0; j < rowlength; j++) {
// we copy the r-th row to out
out.push_back(temp[r][j]);
}
}
Ваше решение использовало std::vector<int>
вместо std::vector<std::vector<int>>
.Первый не поддерживает доступ к элементам с помощью синтаксиса [][]
.
Вы также присваивали этому вектору его границы.Это приводит к неопределенному поведению .Всегда используйте push_back
или emplate_back
для добавления элементов.Используйте operator []
только для доступа к текущим данным.
Наконец, то же самое относится и к вставке строки в вектор out
.Только вы можете знать, содержит ли вектор out
достаточно элементов.Мое решение предполагает, что out
пусто, поэтому нам нужно push_back
всю строку к нему.
Кроме того: вы можете захотеть использовать std::vector::insert
вместо ручного for()
цикла.Попробуйте заменить третий цикл на:
out.insert(out.end(), temp[r].begin(), temp[r].end());
, что может оказаться более эффективным и читабельным.Внутренний for()
внешний вид первого цикла также может быть заменен таким образом (или даже лучше - можно использовать вектор с использованием итераторов, полученных из вектора in
).Я настоятельно советую вам попытаться реализовать это.