请问关于set的有关问题
请教关于set<string>的问题
用 set<string> 实现去重排序,set可以自动排序 去重,但是怎么统计重复数量和重复的数据呢,另外如何让他不自动排序呢。
看网上 自定义一个比较函数 mycomp ,我这样定义 (set<string,mycomp>::iterator iter; )为什么编译出错呢 (vs2010)
错误error C2679: 二进制“=”: 没有找到接受“std::_Tree_const_iterator<_Mytree>”类型的右操作数的运算符(或没有可接受的转换
------解决思路----------------------
这个定义的时候就加个
------解决思路----------------------
既然要统计重复数量,我觉得不应该使用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:自定义一个类
------解决思路----------------------
这里有点错误更正下,true表示第一次插入,false表示重复插入
用 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++;
}
*/
}
}
------解决思路----------------------
这里有点错误更正下,true表示第一次插入,false表示重复插入