逐行读取一个文件,然后去重复后放到一个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行的时候明显很慢了。所以求前辈们帮忙优化一下,或者有其他方法也行,先谢谢大家!

解决方案 »

  1.   

    你使用map存string不就是了吗  自动就去重复了...
      

  2.   

    1楼是正确的,map的key是唯一的。
      

  3.   

    你好,你是说定义一个map<string,string>来存么?
    如果这样的话,那后面我要将这个map输出到文件,map有GetSize之类的函数和他可以直接用下标来用for循环输出么
      

  4.   

    使用STL中的set容器,每读一行后insert进去,它会自动去重复。
    由于set容器内部是用平衡二叉搜索树中的红黑树实现的,效率比顺序遍历高不少。
    如果还出现性能瓶颈的话,可以考虑使用hash_map来改善字符串对比时的效率问题。
    当然,也可以自己设计数据结构和算法来高效解决你的问题。
      

  5.   

    set<string>
    有size()方法可以返回它内部字符串的数目。
    不能用数组下标访问,但可以用迭代器,在for循环中遍历输出。
      

  6.   

    恩,我试过了,确实不错啊,set和vector很类似,就是多了去重谢谢啦
      

  7.   

    你好,你是说定义一个map<string,string>来存么?
    如果这样的话,那后面我要将这个map输出到文件,map有GetSize之类的函数和他可以直接用下标来用for循环输出么有类似的函数  你可以用迭代器遍历...
      

  8.   

    map<string,string> mymap;
    ...
    map<string,string>::iterator iter;
    for(iter=mymap.begin();iter!=mymap.end();iter++)
    {
    cout<<iter->first<<endl;
      

  9.   


    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联合起来才是最强大的!谢谢楼上各位的帮助了,结贴给分