Если я введу точно такой же код в основной функции без указания функции, она будет работать нормально
Нет. У вас была бы точно такая же проблема.
[...] Инвертор должен быть 2D-вектором [...]
Это не так. std::vector<float> invector
- это вектор float
s, не являющийся 2D-вектором любого вида.
Вы получаете ошибку, потому что invector[i]
- это float
, а float
s не имеет operator[]
.
Другие незначительные проблемы в вашем коде:
Не передавайте большие векторы по значению. Вместо этого передайте по ссылке, чтобы избежать ненужной копии.
int vsize = (int) invector.size() * column;
Не используйте приведения в стиле c ((int)
). Если вы хотите разыграть, используйте static_cast
. Хотя вам вовсе не нужно сниматься здесь. Тип, используемый для размеров контейнера: size_t
. Это без знака. int
подписано, но размер контейнера не может быть отрицательным. На самом деле, не проходите column
. Как только вы сделаете invector
2D, он будет знать свои размеры (см. Ниже), нет необходимости передавать его вместе с вектором.
Кроме того, отслеживание индекса k
подвержено ошибкам и не является действительно необходимым. Циклы проще, когда они написаны как диапазоны, основанные на циклах.
Если все внутренние векторы имеют одинаковый размер и минимальные изменения применяются к вашему коду, это может выглядеть так:
using my1Dvector = std::vector<float>;
using my2Dvector = std::vector<my1Dvector>;
my1Dvector onelinevector(const my2Dvector& invector){
my1Dvector v1d;
if (invector.size() == 0) return v1d;
v1d.reserve(invector.size() * invector.front().size());
for (auto& innervector : invector) {
for (auto& element : innervector) {
v1d.push_back(element);
}
}
return v1d;
}
Почти последнее, но не менее важное: вместо нажатия элемента вручную вы можете использовать insert
(см. здесь ):
my1Dvector onelinevector(const my2Dvector& invector){
my1Dvector v1d;
if (invector.size() == 0) return v1d;
v1d.reserve(invector.size() * invector.front().size());
for (auto& innervector : invector) {
v1d.insert(v1d.end(),innervector.begin(),innervector.end());
}
return v1d;
}
Последнее, но не менее важное, такое преобразование пахнет как ненужное Работа. Если вы хотите, чтобы данные хранились в плоском векторе, лучше сначала сохранить их в плоском векторе. С другой стороны, вы можете сохранить его в двумерном векторе и эмулировать 1D-доступ путем преобразования только индекса.