vector的push_back(Object)中的Object应是对象还是对象指针?有何区别?

时间:2021-02-13 04:16:35
我要将提取的数据存到vector 中,但对push_back的应该是对象还是对象指针有点不太清楚 
代码如下: 
                                        if ( szNodeName == "PointData" ) 
                                        { 
IXMLDOMNode  *pXDN3; 
pXDN2->get_firstChild(&pXDN3); 

CTrochoidData szTrochoidData; 
//CTrochoidData *lpszCTrochoidData = new CTrochoidData ();


while (pXDN3 != NULL) 

BSTR_NodeName  = NULL; 
pXDN3->get_nodeName(&BSTR_NodeName); 
szNodeName =  (CString)BSTR_NodeName; 
if ( szNodeName == "WellLength" ) 

pXDN3->get_text(&BSTR_item); 
bstr_item = BSTR_item; 

CString strWellLength = bstr_item.copy(); 
szTrochoidData.m_fWellLength = _wtof(strWellLength); 

else if ( szNodeName == "SlantAngle" ) 

pXDN3->get_text(&BSTR_item); 
bstr_item = BSTR_item; 

CString strSlantAngle = bstr_item.copy(); 
szTrochoidData.m_fSlantAngle = _wtof(strSlantAngle); 

else if ( szNodeName == "AzimuthAngle" ) 

pXDN3->get_text(&BSTR_item); 
bstr_item = BSTR_item; 

CString strAzimuth = bstr_item.copy(); 
szTrochoidData.m_fAzimuthAngle = _wtof(strAzimuth); 

pXDN3->get_nextSibling(&pXDN3); 

m_trochoidDataVec.push_back(szTrochoidData); 



vector的定义: vector <CTrochoidData> m_trochoidDataVec; //数据vector 

其他代码可以不必理会,只注意下面这三句就可以了, 
CTrochoidData szTrochoidData; 
//CTrochoidData *lpszCTrochoidData = new CTrochoidData (); 
m_trochoidDataVec.push_back(szTrochoidData); 
我觉得应该用new出来的对象指针,然后用vector中的元素指向这个空间,当然vector的定义也应该相应改为 
vector <CTrochoidData *> m_trochoidDataVec; //数据vector 
但我现在适用的是定义对象的方式,而不是对象指针的方式,运行起来也没有错误, 
但我觉得这儿应该出错的,因为这个定义的对象是一个局部变量,它的定义处理这个局部定义区间就实效了 
不知道我这样认为对不对? 
我是想知道为什么没有出错 
请指教! 
谢谢! 

14 个解决方案

#1


放入的是一个副本.

LZ可以写一个类,在构造函数和西狗函数中加一些信息输出语句

然后将此类对象push_back看看效果

#2


Vector的每个元素是指针

#3


我的意思是说这个局部变量出了其作用域后,存储该变量的空间也就相应地不存在了
“副本”:存储空间在那儿呢?
“指针”:指针指向的存储空间是哪儿呢?

#4


“副本”:存储空间在那儿呢? 

自然是vector维护的,具体的可以想办法寻找stl实现

#5


引用 2 楼 sun_hw 的回复:
Vector的每个元素是指针


    指针?应该是副本,就是类似于函数返回值,迭代器才是指针。

#6


你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?

#7


“副本”:存储空间在那儿呢? 

自然是vector维护的,具体的可以想办法寻找stl实现


你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?

#8


引用 7 楼 fescort 的回复:
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?

是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。

#9


在VS2005里,可以在#include <vector>那里,鼠标右键,有一项打开指定文档,就可以打开vector文件,看他的源代码。VS2005用的STL里vector的底层是用deque实现的,还要去看deque的源代码才能彻底弄明白。

#10


引用 8 楼 gaoteng1984 的回复:
是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。


如果是每次push_back都new出来一个对象的存储空间的话,
那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了
CTrochoidData *lpszCTrochoidData = new CTrochoidData (); 
m_trochoidDataVec.push_back(lpszCTrochoidData); 

#11


引用 10 楼 fescort 的回复:
引用 8 楼 gaoteng1984 的回复:
是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。 
 

如果是每次push_back都new出来一个对象的存储空间的话, 
那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了 
CTrochoidData *lpszCTrochoidData = new CTrochoidData…


     当然不申请。压入指针就存贮指针嘛。

#12


这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:六&四&七&九&八&七&九&二,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!

#13


vector的push_back(Object) Object可以是指针也可以是对象。
我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。

#14


这种情况下,不会再申请新的内存。
因为这时你的vector要这样定义:
vector<CTrochoidData*> m_trochoidDataVec;
即每个元素是1个指针,而不是对象。
指针的拷贝构造,就是普通变量的赋值操作,不会新new出该类的对象。


执行push_back时,该函数会检查if (size() < capacity()),如果成立,则不需要申请新内存,在老内存里使用placement new,即最里面是这个语句:
template<class _T1, class _T2>
void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
{
    ::new (_Ptr) _T1(_Val);
}
其中_Ptr是那个即将存放这个对象的内存指针,Val是push_back(lpszCTrochoidData)中的lpszCTrochoidData。
相当于执行 ::new (_Ptr) CTrochoidData* (lpszCTrochoidData);

#1


放入的是一个副本.

LZ可以写一个类,在构造函数和西狗函数中加一些信息输出语句

然后将此类对象push_back看看效果

#2


Vector的每个元素是指针

#3


我的意思是说这个局部变量出了其作用域后,存储该变量的空间也就相应地不存在了
“副本”:存储空间在那儿呢?
“指针”:指针指向的存储空间是哪儿呢?

#4


“副本”:存储空间在那儿呢? 

自然是vector维护的,具体的可以想办法寻找stl实现

#5


引用 2 楼 sun_hw 的回复:
Vector的每个元素是指针


    指针?应该是副本,就是类似于函数返回值,迭代器才是指针。

#6


你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?

#7


“副本”:存储空间在那儿呢? 

自然是vector维护的,具体的可以想办法寻找stl实现


你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?

#8


引用 7 楼 fescort 的回复:
你是说在vector调用push_back时vector自身申请了一个存储空间去存储push_back进来的元素吗?

是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。

#9


在VS2005里,可以在#include <vector>那里,鼠标右键,有一项打开指定文档,就可以打开vector文件,看他的源代码。VS2005用的STL里vector的底层是用deque实现的,还要去看deque的源代码才能彻底弄明白。

#10


引用 8 楼 gaoteng1984 的回复:
是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。


如果是每次push_back都new出来一个对象的存储空间的话,
那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了
CTrochoidData *lpszCTrochoidData = new CTrochoidData (); 
m_trochoidDataVec.push_back(lpszCTrochoidData); 

#11


引用 10 楼 fescort 的回复:
引用 8 楼 gaoteng1984 的回复:
是这样的。vector有他的优化策略,实现new出了一段内存,然后每次push_back的时候,在相应的位置处使用placement new,调用元素类的拷贝构造函数,复制出一个副本对象来。 
 

如果是每次push_back都new出来一个对象的存储空间的话, 
那使用指针、压入指针时是否申请一个对象的存储空间的内存呢?new指针时已经new出来了一块内存了 
CTrochoidData *lpszCTrochoidData = new CTrochoidData…


     当然不申请。压入指针就存贮指针嘛。

#12


这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:六&四&七&九&八&七&九&二,不要说我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!

#13


vector的push_back(Object) Object可以是指针也可以是对象。
我个人觉得push_back是vector的成员函数,所以vector里面存的内容和一般类传值和传指针没什么区别。
另外vector不是每次都分配内存,而是一次分配一大块存储空间,用完了再追加。

#14


这种情况下,不会再申请新的内存。
因为这时你的vector要这样定义:
vector<CTrochoidData*> m_trochoidDataVec;
即每个元素是1个指针,而不是对象。
指针的拷贝构造,就是普通变量的赋值操作,不会新new出该类的对象。


执行push_back时,该函数会检查if (size() < capacity()),如果成立,则不需要申请新内存,在老内存里使用placement new,即最里面是这个语句:
template<class _T1, class _T2>
void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
{
    ::new (_Ptr) _T1(_Val);
}
其中_Ptr是那个即将存放这个对象的内存指针,Val是push_back(lpszCTrochoidData)中的lpszCTrochoidData。
相当于执行 ::new (_Ptr) CTrochoidData* (lpszCTrochoidData);