[编程求助]C++中vector插入的是引用而不是值?

代码如下:std::vector<LPCTSTR>strlist;std::vector<LPCTSTR>::iteratorit;strlist.reserve(256... 代码如下:
std::vector<LPCTSTR> strlist;
std::vector<LPCTSTR>::iterator it;
strlist.reserve(256);

while(!m_pRecordset->adoEOF)
{
LPCTSTR strTmp;
char chTmp[256];

sprintf_s(chTmp,(LPCTSTR)((_bstr_t)m_pRecordset->GetCollect("TITLE").GetVARIANT()));
strTmp =(LPCTSTR)chTmp;

strlist.push_back(strTmp);

printf("取到的字符为:%s\n",strTmp);
m_pRecordset->MoveNext();
}
这样我插入的全部是局部变量strTmp的引用于是整个vector都是它

调试的时候发现每当strTmp的值发生改变,容器中所有的值都发生了变化
如果我想插入它的值,应该怎么做呢?
本人java过来的,刚上手还是迷糊
各位小伙伴们,在你们的启发下问题我已经解决了
可能方法不是最好的但是能正确输出了,代码如下

std::vector<char*> strlist;
std::vector<char*>::iterator it;
strlist.reserve(256);
int nLen =0;
while(!m_pRecordset->adoEOF)
{
char chTmp[46][256];

sprintf_s(chTmp[nLen],(char*)((_bstr_t)m_pRecordset->GetCollect("TITLE").GetVARIANT()));
strlist.push_back((char *)chTmp[nLen]);

printf("取到的字符为:%s\n",chTmp[nLen]);
m_pRecordset->MoveNext();
nLen++;
}
因为我知道记录集这一列只有46个值所以可以临时这么用
重点是各位提供的方法压入的都是指针而不是值
chTmp指针始终指向同一块内存,导致所有元素的值都相同
用二维数组可以解决这个问题,谢谢各位!
展开
 我来答
yuantailing
推荐于2016-04-16 · TA获得超过2545个赞
知道小有建树答主
回答量:1167
采纳率:92%
帮助的人:640万
展开全部
vector插入的是值。在整个循环里,strTmp的值都没有变过,它总是指向同一个字符串,所以往vector里插入的字符指针都指向同一个字符串,所以一起发生变化。

一种改法:
char chTmp[256];
改成
char *chTmp = new char[256];
这样每次申请一块新的内存空间,往里面放字符串,然后将指针压入vector中。
百度网友6a7f26bf6
2013-10-17 · TA获得超过208个赞
知道小有建树答主
回答量:175
采纳率:0%
帮助的人:173万
展开全部
按你java的观点来理解,确实是插入的引用,不是值,但是C++中的引用是另一种概念,strTmp是一个指针,你插入的实际上是指针,其实java的引用类型就是C++的指针类型,你如果只想传递值,你可以这么做std::vector<LPCTSTR> strlist;把其中的LPCTSTR类型改成值的类型,然后插入的时候不要插入strTmp,而是插入*strTmp,即strlist.push_back(*strTmp);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fin86889003
2013-10-17
知道答主
回答量:19
采纳率:0%
帮助的人:18.6万
展开全部

strTmp =(LPCTSTR)chTmp;这行有问题。

字符串拷贝不要直接用“=”,用strCpy或memcpy,你的程序没必要申请2个字符串。

std::vector<char*> strlist;
std::vector<char*>::iterator it;
strlist.reserve(256);

while(!m_pRecordset->adoEOF)
{
//LPCTSTR strTmp;
char chTmp[256];

sprintf_s(chTmp,(char*)((_bstr_t)m_pRecordset->GetCollect("TITLE").GetVARIANT()));
//strTmp =(LPCTSTR)chTmp;

strlist.push_back((char*)chTmp);

printf("取到的字符为:%s\n",chTmp);
m_pRecordset->MoveNext();
}

没取数据库,写的假数据,上述代码,测试后无误。

追问

这位兄弟,我也觉得你的思路是正确的,而且也应该是这样的

可是我这边实际测试的结果还是不对,是我编译器有问题吗?

给你看下结果

printf输出是和数据库相同的

但是调试信息里面看到strlist依然是每次全变

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式