逐行读取一个文件,然后去重复后放到一个vector中
我是每读一行后都到vector中遍历一遍,如果没有重复的则pushback,函数是
//查找重复函数
int FindSameInVector(string str,vector<string> vctStr)
{
if(!vctStr.size())
return 0;
for (UINT i = 0 ; i < vctStr.size() ; i ++)
{
if(vctStr[i] == str)
return 1;
}
return 0;
}//函数调用
if((strTemp != "")&&(strTemp.length() != 1)&&(!FindSameInVector(strTemp,vctStr)))
vctStr.push_back(strTemp);
这样做的话有个问题就是前期很快,越到后面越慢,甚至电脑都卡。当文件行数差不多1W行的时候明显很慢了。所以求前辈们帮忙优化一下,或者有其他方法也行,先谢谢大家!
我是每读一行后都到vector中遍历一遍,如果没有重复的则pushback,函数是
//查找重复函数
int FindSameInVector(string str,vector<string> vctStr)
{
if(!vctStr.size())
return 0;
for (UINT i = 0 ; i < vctStr.size() ; i ++)
{
if(vctStr[i] == str)
return 1;
}
return 0;
}//函数调用
if((strTemp != "")&&(strTemp.length() != 1)&&(!FindSameInVector(strTemp,vctStr)))
vctStr.push_back(strTemp);
这样做的话有个问题就是前期很快,越到后面越慢,甚至电脑都卡。当文件行数差不多1W行的时候明显很慢了。所以求前辈们帮忙优化一下,或者有其他方法也行,先谢谢大家!
解决方案 »
- 大家觉得女士适合做程序么?不然你觉得应该做什么?
- 基于http协议文件下载 下载文件大小不正确,求解?
- 在窗口程序上单击一个按钮,如何能启动浏览器连接到百度?
- 请问byte[]转string 如何做?
- 怎样重载CDialog类???
- 无模式对话框调用CMainFrm中的公用变量的问题
- [新人提问]要对话框读取程序中的文本并显示出来,是要用editbox还是listbox显示?
- 请问一个幼稚的问题:select SERV_TYPE_ID from BILL.SERV 中的BILL是什么意思?BILL是数据库名吗?还是BILL.SERV整体是一个表名?
- 有谁知道CWnd类中的getsel()是怎样实现的。
- MFC 生成html
- MFC ActiveX工程使用CComPtr失败的小问题
- GetClientRect的问题
如果这样的话,那后面我要将这个map输出到文件,map有GetSize之类的函数和他可以直接用下标来用for循环输出么
由于set容器内部是用平衡二叉搜索树中的红黑树实现的,效率比顺序遍历高不少。
如果还出现性能瓶颈的话,可以考虑使用hash_map来改善字符串对比时的效率问题。
当然,也可以自己设计数据结构和算法来高效解决你的问题。
有size()方法可以返回它内部字符串的数目。
不能用数组下标访问,但可以用迭代器,在for循环中遍历输出。
如果这样的话,那后面我要将这个map输出到文件,map有GetSize之类的函数和他可以直接用下标来用for循环输出么有类似的函数 你可以用迭代器遍历...
...
map<string,string>::iterator iter;
for(iter=mymap.begin();iter!=mymap.end();iter++)
{
cout<<iter->first<<endl;
}
map<string,string> mapTrans;
set<string>::iterator itSrc,itTar;
for (itSrc = stSrc.begin(),itTar = stTar.begin() ; itSrc != stSrc.end() ; itSrc ++,itTar ++)
{
mapTrans[*itSrc] = *itTar;
}
这样用起来非常爽啊,原来map和set联合起来才是最强大的!谢谢楼上各位的帮助了,结贴给分