首页 新闻 会员 周边

关于Vector 的 assign()

0
悬赏园豆:100 [已关闭问题] 关闭于 2013-07-19 16:37

Effective STL 条款5:尽量使用区间成员函数代替它们的单元素兄弟

事实上,我在使用assign()的时候,运行会出现

 

尝试读写一段内存XXX之类的,意思就是说 访问非法。

 

我尝试在使用assigen()前resize(),还是会非法访问内存,

v2.resize(v1.size());

v2.assign(v1.begin(),v1.end());

请问,这个是什么情况?

PS:

我使用
for(auto item = v1.begin();item != v1.end();item++)

{  v2.push_back(*item);}

这样是没有错误的。

 

我是不是在使用assign()前,做一些初始化工作?

网路上有说使用前调整大小,需要吗??

 

 出问题的函数:

std::vector<std::string> fun( SOCKET s )
{
char getbuf[1024];memset(getbuf,0,1024);
static std::vector<std::string> old_vs; //静态的,为了保留数据
int recvLen = 0;
if((recvLen = recv(s,getbuf,1024,0)) < 5 )
{
return old_vs;
}
std::vector<std::string> vs;
std::string buffer(getbuf);
vs =split(buffer.c_str(),"|");//buffer内有|来分割。
if(vs.size() >1)
{
std::vector<std::string>::iterator it = vs.begin();//业务需求,去掉头
vs.erase(it);
}else
{
vs.clear();
return old_vs;//没数据,返回旧的
}
if (vs.size() < 49 )//NULL
{
return old_vs;
}else //记录旧数据
{
//如果这次没有得了数据,
if (old_vs.size() > 0)
{
old_vs.clear();
}
for (auto item = vs.begin();item != vs.end();item++)
{
old_vs.push_back(*item);
}
//old_vs.assign(vs.begin(),vs.end());//使用 assign()会有问题。
}
PlacingOrderToFile(PlacingOrderFilename(),buffer.c_str(),buffer.size()); //落盘
return vs;
}

 

函数就是这样,返回一个向量效率低,这个返回什么会好点?

同时,assige函数,的确造成程序死掉。

硬盘很大的主页 硬盘很大 | 初学一级 | 园豆:16
提问于:2013-06-14 16:11
< >
分享
所有回答(2)
0

 V1  V2. 应该具有相同的构造函数,实在不行把源码完整贴出来看看

还在想啊 | 园豆:160 (初学一级) | 2013-06-15 08:04

v1,v2,只是两个 普通 的vector而已。

vector<string> v1;

vector<string> v2;

。。。。。

就这样。

支持(0) 反对(0) 硬盘很大 | 园豆:16 (初学一级) | 2013-06-15 08:56

@硬盘很大:

这是我的测试代码, 没问题啊

 

#include "stdafx.h" #include <string> #include <vector>

using namespace std; vector<string> vect1; string str1 = "ABC";

int _tmain(int argc, _TCHAR* argv[]) {

 vect1.push_back(str1);  vect1.push_back(str1);  vect1.push_back(str1);  vector<string> vect2;  vect2.assign(vect1.begin(), vect1.end());

 return 0; }

支持(0) 反对(0) 还在想啊 | 园豆:160 (初学一级) | 2013-06-15 21:58

@还在想啊: 只是没触发到这个问题而已。

 

如果有问题,Effective STL里就 不会推荐使用区间函数了。

肯定是某个原因造成了数据赋值失败。而且这个原因比较难触发。

支持(0) 反对(0) 硬盘很大 | 园豆:16 (初学一级) | 2013-06-17 12:58

@硬盘很大: 如果可以你把你出错的关键代码贴上来,考虑到安全性,请不要直接贴,稍微改改我就不知道你的源代码了

支持(0) 反对(0) 还在想啊 | 园豆:160 (初学一级) | 2013-06-18 07:33

@还在想啊: 应该是STL本身的问题。不要太相信STL了。

多线程下面,STL出现的问题,又不是一种,即使自己同步 做的再好,也会出现意外情况。

支持(0) 反对(0) 硬盘很大 | 园豆:16 (初学一级) | 2013-07-19 16:36
0

没找到满意回答。

硬盘很大 | 园豆:16 (初学一级) | 2013-07-19 16:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册