为什么我不能迭代这个 C++ 映射?出现错误,例如我无法使用<运算符
why I cannot iterate this c++ map? Getting error like I cannot use the < operator
#include "UserUserSim.h"
UserUserSim::UserUserSim(string &query_url):
_query_url(query_url)
{
}
void UserUserSim::calculate(){
ifstream infile(_query_url.c_str());
string line;
while(infile){
int movie_id;
int user_id;
infile>>line;
if (line[line.length()-1]==':'){
movie_id=atoi(line.c_str());
cout<<line<<endl;
}
else{
user_id=atoi(line.c_str());
if (_set.find(user_id)==_set.end())
getTop(user_id);
float score=getScore(user_id,movie_id);
cout<<score<<endl;
}
}
}
float UserUserSim::getScore(int &user_id, int &movie_id){
vector<USim>* p=_map[user_id];
MovieList* ml=MovieDictionary::getInstance().getMovie(movie_id);
ml->sortList();
vector<UserScore>::iterator it;
vector<USim>::iterator sim_it=p->begin();
float score=0;
float total_weight=0;
for (it=ml->begin();it<ml->end();it++){
while ((*it).user_id>(*sim_it).user_id){ // the user did not rate in ths movie
sim_it++;
}
if ((*it).user_id==(*sim_it).user_id){
score+=(*sim_it).score * (*it).rating; // score of similarity * rating
total_weight+=(*sim_it).score;
sim_it++; // move on to the next user
}
}
score=score/total_weight;
return score;
}
typedef pair<int, float> mapPair;
bool compareSim(mapPair p1, mapPair p2){
return p1.second>p2.second;
}
bool compareID(mapPair p1, mapPair p2){
return p1.first<p2.first;
}
void UserUserSim::getTop(int &user_id){
vector<USim> list;
vector<USim>* p=&list;
_map.insert(pair<int,vector<USim>*>(user_id,p));
_set.insert(user_id);
UserList* ul=UserDictionary::getInstance().getUser(user_id);
map<int,float> user_score_map;
vector<MovieScore>::iterator it;
vector<UserScore>::iterator it_movie; // the iterator for the movielist
for (it=ul->begin();it<ul->end();it++){ // for each movie rating in the Vector
int movie_id=(*it).movie_id;
MovieList* ml=MovieDictionary::getInstance().getMovie(movie_id);
for(it_movie=ml->begin();it_movie<ml->end();it_movie++){
int user_id=(*it_movie).user_id;
if (user_score_map.find(user_id)==user_score_map.end()){
user_score_map.insert(pair<int,float>(user_id,0));
}else{
user_score_map[user_id]+=(*it).rating*(*it_movie).rating;// the vector's user rating x the rating of the movie,user
}
}
}
//vector< pair<int,float> > user_score_v;
map<int,float>::iterator it_map;
for (it_map=user_score_map.begin();it_map<user_score_map.end();it_map++){} //<=============where error happens
}
请注意,如果我包含最后一行,我将得到如下错误:
g++ src/main.cpp src/CorpusExp.cpp src/MovieList.cpp src/MovieDictionary.cpp src/UserDictionary.cpp src/UserList.cpp src/UserUserSim.cpp -o recommend
src/UserUserSim.cpp: In member function ‘void UserUserSim::getTop(int&)’:
src/UserUserSim.cpp:81: error: no match for ‘operator<’ in ‘it_map < user_score_map. std::map<_Key, _Tp, _Compare, _Alloc>::end [with _Key = int, _Tp = float, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, float> >]()’
make: *** [recommend] Error 1
对 c++ 几乎不陌生,我检查了一些参考资料,我认为迭代映射是可以的,否则,我如何将映射中的一些元素(如 top k)复制到向量中?
关系比较(如运算符<
、>
等)仅适用于随机访问迭代器。
std::map
迭代器是双向迭代器,这比随机访问的规范要弱得多。不能将关系比较与双向迭代器一起使用。地图迭代器仅在相等性方面具有可比性。在循环条件中使用!=
比较,而不是<
。
真正需要时才使用关系比较,即尽可能依赖较弱的要求集,这始终是一个好主意。
在最后一行中,尝试以下操作:
for (it_map = user_score_map.begin(); it_map != user_score_map.end(); ++it_map)
应在所有代码中遵循此模式。
您需要将问题减少到最少的代码量!大多数代码似乎与问题完全无关!
问题在于双向迭代器没有定义小于关系。你只比较它们的相等或不平等。只需使用
it != map.end()
而不是
it < map.end()
您需要随机访问迭代器才能将它们与"<"进行比较,但 std::map 的迭代器不是随机访问的(我不确定它们是什么,可能是双向的)。
无论如何,在迭代容器时,您应该使用 "!=" 进行比较,而不是 "<",无论是使用 std::map 迭代器还是任何其他容器的迭代器。
相关文章:
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何显式调用运算符<<
- 为什么COUT在朋友函数中不起作用,该功能超载了操作员&lt;&lt;这是一个iStream运算符
- C++运算符<<调用::ostream而不是std::osttream
- BOOST ::变体无法解决运算符&lt;&lt;对于STD :: Ostream
- 过载输出<<用于类的运算符,以打印其中的元组
- 重载运算符<<:此运算符函数的参数太多
- C++继承运算符<<
- 重载运算符<<用于模板类.即使使用好友关键字也无法获得私人会员
- 为什么字符串流运算符<<擦除原始值
- 关于使用运算符<<为新手提供C++中的模板
- 重载运算符<<输出地址而不是数据成员
- 错误:没有匹配'运算符<<"在'std::cout
- 重载运算符<<用于ostream语法
- 如何为运算符<<
- Qt过载数据流运算符<<
- 我可以使用define调用运算符<<
- 运算符<<(ostream&os,..)用于模板类
- 重载<<运算符错误C2804:二进制'运算符<<'参数太多
- Can运算符<<用于设计我们自己的输出显示方式