Элементарный вопрос по контейнерам.

  • Автор темы wombat
  • Дата начала
Статус
Закрыто для дальнейших ответов.
W

wombat

Гость
#1
Есть код:
Код:
#include "stdafx.h"
namespace std{};
using namespace std;
#include "vector"


class CMyClass{
public:
CMyClass(){printf("Create\n");}
CMyClass(const CMyClass &src){printf("Copy create\n");};
~CMyClass(){printf("Delete\n");}

void SayHello(){printf("Hi\n");};
void SaySomething(){printf("Something\n");};
};

int main(int argc, char* argv[])
{
vector<CMyClass> aMyClassVector2;

CMyClass temp;
temp.SayHello();

aMyClassVector2.push_back(temp);
aMyClassVector2.push_back(temp);

return 0;
}
По идее, результат, появляющийся на экране должен иметь вид:
Create
Hi
Copy create
Copy create
Delete
Delete
Delele​
однако имеем:
Create
Hi
Copy create
Copy create
Copy create
Delete
Delete
Delele
Delele​
Внимание вопрос: откуда взялся еще один элемент в контейнере?

P.S. Ногами не бейте - я на старости лет решил наконец то разобраться с C :rolleyes:
 

grigsoft

Well-Known Member
15.11.2005
735
0
#2
А поставить точку в конструкторе и отладиться? Заодно и нам расскажешь.

Да, рискну предположить что это копирование элементов при расширении вектора. В таком случае если добавить еще один элемент то должно удвоиться еще раз.
 
W

wombat

Гость
#3
Таки да, это memory reallocation. Спецы на rsdn были быстрее :rolleyes:
 
T

tansa

Гость
#4
В моменте, когда создается вектор. Ты туда даешь тип данных. Для того, чтобы знать его размер делается объект. На сколько я знаю именно так работает sizeof. Делает копию и мереет.
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#5
не меряет. а sizeof это вообще операция времени компиляции
 
T

tansa

Гость
#6
Ну вообще да... ерунду я спи***нул.
Весь STL работает на том, что копирует и хранит копии, а объекты можно сразу вываливать.
Только то что siezof это часть компилятора верить мне не охота.
как тогда объяснить факт, чтo скорость работы петли с sizeof'ом реально зависит от того const или нет дается sizeof'у?
 

grigsoft

Well-Known Member
15.11.2005
735
0
#7
Гм. Ну загляни в асм сгенеренный, если верить не охота.
 
T

tansa

Гость
#8
гы:D
Верить не охота так же сильно как и в асме рыться :D
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#9
sizeof операция времени компиляции и не может быть другой, т.к. С\С++ языки со статической типизацией, и в обзем случае(RTTI не рассматриваем) информации о типе в run-time получить не возможно.
 

Гость
#10
<!--QuoteBegin-wombat+4:05:2007, 08:23 -->
<span class="vbquote">(wombat @ 4:05:2007, 08:23 )</span><!--QuoteEBegin-->я на старости лет решил наконец то разобраться с C
[snapback]64605" rel="nofollow" target="_blank[/snapback]​
[/quote]
Ну, во-первых не с С, а с STL, что есть зверь совсем отдельный и своеобразный. Во-вторых, такая трасса еще и от имплеменатации STL зависит, например, в Visual Studi 8 трасса получается вообще такая вот:
Create
Hi
Copy create
Copy create
Delete
Copy create
Copy create
Copy create
Delete
Delete
Delete
Delete
Delete
Они там еще во внутреннем STL-овском insert локальную копию делают на всякий случай...

А лишнее похоже от того, что STL переразмещает массив (поскольку он увеличивается), и копирует все элементы. Извини, но никто не обещал эффективные push/pop на векторе, не для того он.

Попробуй вот такое:
aMyClassVector2.push_back(temp);
printf("***\n");
aMyClassVector2.push_back(temp);
printf("***\n");
aMyClassVector2.push_back(temp);
printf("***\n");
aMyClassVector2.pop_back();
printf("***pop\n");
aMyClassVector2.pop_back();
printf("***pop\n");
aMyClassVector2.push_back(temp);
printf("***\n");
aMyClassVector2.push_back(temp);
printf("***\n");
и увидишь:
C Hi
Cc Cc D ***
Cc Cc Cc D D ***
Cc Cc Cc Cc D D D ***
D ***pop
D ***pop
Cc ***
Cc ***
D D D D
(я все эти Create-Create copy-Delete до одной-двух букв сократил)
 
Статус
Закрыто для дальнейших ответов.