Две функции делают разные вещи!
Метод resize()
(и передающий аргумент конструктору эквивалентен этому) будет вставлять или удалять соответствующее количество элементов в вектор, чтобы сделать его заданным размером (у него есть необязательный второй аргумент, чтобы указать их значение). Это повлияет на size()
, итерация пойдет по всем этим элементам, push_back вставляет после них, и вы можете напрямую обращаться к ним с помощью operator[]
.
reserve()
только выделяет память, но оставляет ее неинициализированной. Это влияет только на capacity()
, но size()
не изменится. Для объектов нет значения, потому что ничего не добавляется к вектору. Если вы вставляете элементы, перераспределение не произойдет, потому что это было сделано заранее, но это единственный эффект.
Так что это зависит от того, что вы хотите. Если вам нужен массив из 1000 элементов по умолчанию, используйте resize()
. Если вам нужен массив, в который вы ожидаете вставить 1000 элементов, и хотите избежать нескольких распределений, используйте reserve()
.
EDIT: комментарий Бластфурнаса заставил меня снова прочитать вопрос и понять, что в вашем Если правильный ответ не будет предварительно распределен вручную. Просто продолжайте вставлять элементы в конце по мере необходимости. Вектор будет автоматически перераспределяться по мере необходимости и будет делать это больше эффективно, чем упомянутый ручной способ. Единственный случай, когда reserve()
имеет смысл, - это когда вы имеете достаточно точную оценку общего размера, который вам будет легко доступен заранее.
EDIT2: Редактирование вопроса: если у вас есть первоначальная оценка, тогда reserve()
, которые оцениваются. Если этого оказалось недостаточно, просто дайте вектору сделать это.
Вы не можете рисовать вне функции paintEvent()
, по крайней мере, в Windows и Mac OS. Однако вы можете переопределить функцию MainWindow
класса paintEvent()
класса, чтобы провести там линию. Например:
class Widget : public QWidget
{
protected:
void paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
painter.drawLine(0, 0, 200, 200);
}
};
И использование:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Widget w;
w.show();
[..]
Виджеты можно нарисовать только в соответствующем событии рисования. Вы можете нарисовать пиксельную карту в любой функции, но вам нужно показать результат в событии рисования виджета.
Из документа doc:
Warning: Когда устройство рисования виджет, QPainter может использоваться только внутри функции paintEvent () или в функции, вызванной paintEvent (); то есть, если не установлен атрибут виджета Qt :: WA_PaintOutsidePaintEvent.
blockquote>
Вы не можете рисовать виджет вне события рисования. Но вы можете рисовать в любое время не-виджет, например, на QImage
, QPixmap
или QPicture
. Таким образом, это работает:
[/g0]
#include <QApplication>
#include <QLabel>
#include <QPicture>
#include <QPainter>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel l;
QPicture pi;
QPainter p(&pi);
p.setRenderHint(QPainter::Antialiasing);
p.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
p.drawLine(0, 0, 200, 200);
p.end(); // Don't forget this line!
l.setPicture(pi);
l.show();
return a.exec();
}