请问关于set的有关问题

请教关于set<string>的问题
用 set<string> 实现去重排序,set可以自动排序 去重,但是怎么统计重复数量和重复的数据呢,另外如何让他不自动排序呢。
看网上 自定义一个比较函数 mycomp ,我这样定义 (set<string,mycomp>::iterator iter; )为什么编译出错呢 (vs2010)

错误error C2679: 二进制“=”: 没有找到接受“std::_Tree_const_iterator<_Mytree>”类型的右操作数的运算符(或没有可接受的转换

		
struct mycomp  
{ //自定义比较函数,重载“()”操作符  
bool operator() (string &a, string &b)  
{  
// return a.data()-b.data()>0;
}  
};
string date;
set<string > s;
set<string>::iterator iter;
// set<string,mycomp>::iterator iter;  
ifstream inf("e:\\1.txt");
while (getline(inf, date))
{
s.insert(date);
}
inf.close();
ofstream outf;
outf.open("e:\\2.txt", fstream::out | fstream::app);
for (iter = s.begin(); iter != s.end();iter++)
{
outf <<  *iter<< endl;
}
outf.close();


------解决思路----------------------
set<string > s;
 
这个定义的时候就加个

set<string ,mycomp> s;

------解决思路----------------------
既然要统计重复数量,我觉得不应该使用set,可以考虑使用map<string, int>.
------解决思路----------------------
set成员函数insert()重载函数的一个版本
std::pair<iterator,bool> insert( const value_type& value );

返回pair类型值,第一个是返回迭代器位置,第二个bool值,true表示插入的值在set已经存在,false表示是第一次插入该值
如果你非得用set,可以考虑这个函数,根据返回值pair中的bool来判断是否应该统计出现次数

不过对于你的需求来说,并不是个好办法


------解决思路----------------------
建议两个方法:
1:是用map
2:自定义一个类

#include <iostream>
#include <string>
#include <set>

using namespace std;

class FileWords
{
public:
    FileWords(const std::string &str):m_str(str), m_count(1){}
    bool operator <(const FileWords& rhs) const{ return m_str < rhs.m_str; }
    bool operator==(const FileWords& rhs) const{ return m_str == rhs.m_str; }

    std::string m_str;
    int m_count;

};

int main(int argc, char **argv)
{
    set<FileWords> setWord;

    string tmp[5] = { "11111", "22222", "33333", "11111", "11111" };
    for( int i = 0; i < 5; i++ )
    {
        set<FileWords>::iterator it = setWord.find(tmp[i]);
        if( it != setWord.end() )
        {
            it->m_count++;
        }
        else
        {
            setWord.insert(tmp[i]);
        }

        // 或者这样子
        /*
        pair<set<FileWords>::iterator, bool> pRet = setWord.insert(tmp[i]);
        if( !pRet.second )
        {
            pRet.first->m_count++;
        }
        */
    }
}

------解决思路----------------------
引用:
set成员函数insert()重载函数的一个版本
std::pair<iterator,bool> insert( const value_type& value );

返回pair类型值,第一个是返回迭代器位置,第二个bool值,true表示插入的值在set已经存在,false表示是第一次插入该值
如果你非得用set,可以考虑这个函数,根据返回值pair中的bool来判断是否应该统计出现次数

不过对于你的需求来说,并不是个好办法


这里有点错误更正下,true表示第一次插入,false表示重复插入