2013-07-05 2 views
0

По какой-то причине изменение размера этого двухмерного вектора в моем классе не работает. Спасибо за вашу помощь!Изменение размера 2d вектор - ошибка

.. 
Map::Map(const unsigned int& w, 
     const unsigned int& h, 
     const unsigned int& s) 
    : width(w), height(h), size(s) 
{ 
    squares.resize(width); 
    for (unsigned int i = 0; i < width; ++i) 
    { 
     squares[i].resize(height); // error here 
     for (unsigned int j = 0; j < height; ++j) 
     { 
      squares[i][j] = Square(sf::Vector2f(i * size, j * size)); 
     } 
    } 
} 

std::vector<std::vector<Square>> squares; 
.. 

Некоторые сообщения об ошибках:

C: \ MinGW \ Bin .. \ Lib \ НКУ \ mingw32 \ 4.6.2 \ включать \ C++ \ бит \ stl_uninitialized.h | 481 | instanziiert von »static void std :: __ uninitialized_default_n_1 < TrivialValueType> :: _uninit_default_n (_ForwardIterator, _Size) [с _ForwardIterator = Square *, _Size = unsigned int, bool _TrivialValueType = false]« |

c: \ mingw \ bin .. \ lib \ gcc \ mingw32 \ 4.6.2 \ include \ C++ \ bits \ stl_uninitialized.h | 529 | instanziiert von »void std :: __ uninitialized_default_n (_ForwardIterator, _Size) [с _ForwardIterator = Square *, _Size = unsigned int]« |

+0

У Square есть конструктор по умолчанию? – Peter

+1

рассмотрите возможность использования boost :: multi_array вместо вложенных векторов – aryjczyk

+0

Да, у него есть конструктор по умолчанию: Square (const sf :: Vector2f & pos); – user1429101

ответ

0

Когда вы vector.resize (n) и n> vector.size(), вы просите его создать n - vector.size() новые элементы. Вектор должен быть сконфигурирован по умолчанию, поскольку он не знает, какие аргументы использовать. Если они не являются конструктивными по умолчанию, изменение размера не выполняется.

Однако, если вы не хотите, чтобы квадрат был по умолчанию конструктивным, вы можете изменить строку с ошибкой на vector.reserve() - это только гарантирует, что для новых элементов достаточно места, но на самом деле их не создавать. Тогда вы можете создать их по одному в цикле с использованием

squares[i].emplace_back(sf::Vector2f(i * size, j * size)); 

О, и кстати примитивы передачи по ссылке имеет неоптимальный производительность. Передайте их по значению, если они вам не нужны, как параметры.

+0

. Как хорошая практика использовать ссылки const только в параметрах метода, если это не примитивный тип? – user1429101

+0

в целом, если вы не передают аргумент, он должен быть либо pas sed по значению или по ссылке const. есть 2 отличия 1) производительность - передача по значению копирует объект, проходящий через ref, находится под капотом, проходящим по указателю, поэтому существует уровень косвенности, поэтому вы хотите передать мелкие вещи по значению и большие по ссылке. я где-то читал, что 16B является хорошим порогом на x86, но это скорее ориентир, чем правило. если вы обнаружите, что пишете код, который пропускает множество небольших структур в первичном критически важных областях, вы должны его профилировать и посмотреть, что лучше – aryjczyk

+0

2) если вы хотите выполнить какое-то промежуточное неконстантное вычисление по аргументу, вам нужно будет его скопировать так или иначе, так что это нормально передавать его по стоимости, даже если это большой – aryjczyk

Смежные вопросы