调整 2d 大小错误

Resizing 2d error

本文关键字:错误 2d 调整      更新时间:2023-10-16

出于某种原因,在我的类中调整这个二维向量的大小不起作用。感谢您的帮助!

..
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\gcc\mingw32\4.6.2\include\c++\bits\stl_uninitialized.h|481| instanziiert von »static void std::__uninitialized_default_n_1<<em>TrivialValueType>::_uninit_default_n(_ForwardIterator, _Size( [with _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( [with _ForwardIterator = Square*, _Size = unsigned int]«|

当你 vector.resize(n( 和 n> vector.size(( 时,你要求它创建 n - vector.size(( 新元素。Vector 需要默认构造它们,因为他不知道要使用什么参数。如果它们不是默认可构造的,则调整大小将失败。

但是,如果您不希望 Square 成为默认可构造的,您可以将失败行更改为 vector.reserve(( - 这只能确保有足够的空间容纳新元素,但实际上并没有创建它们。然后,您可以使用

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

哦,顺便说一下,通过引用传递基元具有次优性能。按值传递它们,除非需要它们作为输出参数。