У меня есть вопрос для вас. Предположим, у меня есть вектор AwesomeData, а класс AwesomeData содержит вектор AwesomeData. Если я попытаюсь получить доступ к вектору внутри первого вектора, он работает неправильно. Насколько я знаю, здесь не совсем ясно, что более явный пример:Stange поведение вектора C++
struct AwesomeData
{
public:
AwesomeData()
: beautifulInt(3)
{}
int beautifulInt;
vector<AwesomeData> someVector;
};
int main()
{
vector<AwesomeData> tata;
AwesomeData toto;
toto.someVector.push_back(AwesomeData());
toto.someVector.push_back(AwesomeData());
toto.someVector.push_back(AwesomeData());
tata.push_back(AwesomeData());
tata.push_back(toto);
tata.push_back(AwesomeData());
// So, now tata should containt the data of someVector of toto (3 default
// AwesomeData). Instead of that, his capacity is equal to 3, but his
// size = 0. So, what's wrong ?
tata = tata[1].someVector;
}
Но эй, это еще не все! Я нашел работу, но я не знаю, почему она работает.
struct AwesomeData
{
public:
AwesomeData()
: beautifulInt(3)
{}
int beautifulInt;
vector<AwesomeData> someVector;
};
int main()
{
vector<AwesomeData> tata;
AwesomeData toto;
toto.someVector.push_back(AwesomeData());
toto.someVector.push_back(AwesomeData());
toto.someVector.push_back(AwesomeData());
tata.push_back(AwesomeData());
tata.push_back(toto);
tata.push_back(AwesomeData());
// If we use a second vector to temporaly stock the vector of toto,
// everything work as expected
vector<AwesomeData> tempVector;
tempVector = tata[1].someVector;
tata = tempVector;
}
У кого-нибудь есть идея?
Большое спасибо
[ 'tata.size()' '3' является здесь] (http://ideone.com/7hsoV5). –
Как-то я сомневаюсь, что это фактическая причина, но ваш код является незаконным, имеет неопределенное поведение и не скомпилируется с некоторыми компиляторами. Вы не можете создать вектор неполного типа. –
@sftrabbit Побей меня. – cdhowie