こんにちわ、池内と申します

<1...@gw.zeus.jsdlab.co.jp> の、
   "[vcpp 00035183] STLのmapのinsertでコンパイルエラー" において、
   "赤塚 慶 <k...@jsdlab.co.jp>"さんは書きました:


>   list<Cell*>::iterator iter_x;
>   list<Cell*>::iterator iter_y;

>   map<list<Cell*>::iterator,list<Cell*>::iterator> interaction_map;

mapに挿入するには大小の比較ができる必要がありますが、list<_T>::iteratorは
大小の比較ができないのでmapで扱うことはできないんじゃないかと・・・

以下はiteratorを比較するコードですがコンパイル出来ません。
--- ココから ---
#include<list>
using namespace std;
int main(int argc, char* argv[])
{
list<int>::iterator it1, it2;
if(it1<it2)
{
}
return 0;
}
--- ココまで ---


解決策としてはiteratorをラップしてはどうでしょうか??

--- ココから ---
#include<list>
#include<map>
using namespace std;

template<class _T>
class wrap_iterator{
private:
_T::iterator m_iterator;
public:
wrap_iterator(_T::iterator i):m_iterator(i){};
bool operator<(const wrap_iterator&x)const{
return this<(&x);//適当にアドレスで比較する。
};
};

int main(int argc, char* argv[])
{
typedef map<wrap_iterator<list<int> >, wrap_iterator<list<int> > > my_map;
list<int>::iterator row_iter;
list<int>::iterator col_iter;

my_map interaction_map;
interaction_map.insert(
my_map::value_type(wrap_iterator<list<int> >(row_iter), 
wrap_iterator<list<int> >(col_iter))
);

return 0;
}
--- ココまで ---


ついでに、map::insert()には下記の3つのバージョンがありますが、
私が示したサンプルでは1番目のバージョンを使用しています。
1:pair<iterator, bool> insert(const value_type& x);
2:iterator insert(iterator it, const value_type& x);
3:void insert(const value_type *first, const value_type *last); 
    

NT4.0 VC++6.0 SP3 で試しました。
--
Hideo Ikeuchi
Demo Mod Otaku 古戦場 http://demo.and.or.jp/
E-mail                i...@and.or.jp