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函数,的确造成程序死掉。
V1 V2. 应该具有相同的构造函数,实在不行把源码完整贴出来看看
v1,v2,只是两个 普通 的vector而已。
vector<string> v1;
vector<string> v2;
。。。。。
就这样。
@硬盘很大:
这是我的测试代码, 没问题啊
#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; }
@还在想啊: 只是没触发到这个问题而已。
如果有问题,Effective STL里就 不会推荐使用区间函数了。
肯定是某个原因造成了数据赋值失败。而且这个原因比较难触发。
@硬盘很大: 如果可以你把你出错的关键代码贴上来,考虑到安全性,请不要直接贴,稍微改改我就不知道你的源代码了
@还在想啊: 应该是STL本身的问题。不要太相信STL了。
多线程下面,STL出现的问题,又不是一种,即使自己同步 做的再好,也会出现意外情况。
没找到满意回答。