2016-08-01 4 views
1

Я объявил-структуру, как это:Нажимать в вектор структуры элемент этого вектора

struct Point{ 
    double x,y; 
    Point(){} 
    Point(double xx,double yy): x(xx),y(yy){} 
}; 

И я пытаюсь заполнить вектор вроде этого:

vector<Point> s(1); 
Point tmp(1,2); 
s[0]=tmp; 
s.push_back(s[0]); 

К сожалению , это дает мне неправильный ответ, когда я показываю содержимое s [1], но s.push_back((Point)s[0]) приводит к ожидаемому ответу (например, копия s [0]).

В чем разница между s.push_back(s[0]) и s.push_back((Point)s[0]), что объясняет это differennce?

Есть ли какие-либо преобразования типа авто или что-то под капотом?

+1

's.push_back ((Point [0]))' не имеет смысла, 'Point' является типом. – Borgleader

+2

Какой неправильный/правильный ответ на что? – Svalorzen

+1

'vector s (2, Point (1, 2))' будет намного лучше. – DimChtz

ответ

3

push_back берет аргумент по константной ссылке (и другой перегрузки по ссылке RValue), так что

s.push_back(s[0]); 

использует именующую-ссылку первого элемента, но, push_back может перераспределить, если емкость достаточно невелика. И поэтому ссылка, снятая с s[0], остается болтающейся и уже не жизнеспособной.

С другой стороны

s.push_back((Point)s[0]); 

не создают временный, а затем s[0] больше не используется, что позволяет выдвинуть действительный Point в vector.

+0

где в сообщении используется OP & s [0]? То, что вы говорите, верно, но OP не делает этого, поэтому ваш ответ AFAICT не имеет значения. – Borgleader

+2

@ Бордингдер его не то. Я понял. 's [0]' передается константой-ссылкой на 'push_back', но' push_back' может перераспределять кровать последовательности при изменении размера, оставляя эту * ссылку * зависающей. Я признаю, что заключительное предложение не имеет очевидного смысла (я бы надеялся, что этот комментарий будет сделан). – WhozCraig

+0

@WhozCraig О, я вижу, это имеет смысл сейчас. Я продолжал думать, что вы не могли бы проталкивать T * в вектор T, даже если вы пробовали, и не видели, чтобы он также применялся к ссылкам. Хороший улов. – Borgleader

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