2017-03-21 6 views
1

なぜこのコードはコンパイルされませんか?std :: mapをstd :: list :: iteratorで使用する

#include <map> 
#include <list> 

int main() 
{ 
    typedef std::list<int>::iterator Iter; 

    std::map<Iter, Iter> m; 

    std::list<int> ints; 

    m[ints.begin()] = ints.begin(); 
} 

私はstd::vectorためstd::listを変更すると、すべてが動作します。

次のようにエラーログがある:

|| "==== Building Practical (release) ====" 
|| main.cpp 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
|| C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_function.h: In instantiation of 'bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::_List_iterator<int>]': 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|498 col 32| required from 'std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](std::map<_Key, _Tp, _Compare, _Alloc>::key_type&&) [with _Key = std::_List_iterator<int>; _Tp = std::_List_iterator<int>; _Compare = std::less<std::_List_iterator<int> >; _Alloc = std::allocator<std::pair<const std::_List_iterator<int>, std::_List_iterator<int> > >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = std::_List_iterator<int>; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = std::_List_iterator<int>]' 
main.cpp|12 col 19| required from here 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| error: no match for 'operator<' (operand types are 'const std::_List_iterator<int>' and 'const std::_List_iterator<int>') 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|64| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_pair.h|220 col 5| note: candidate: template<class _T1, class _T2> constexpr bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) 
||  operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_pair.h|220 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::pair<_T1, _T2>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|298 col 5| note: candidate: template<class _Iterator> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&) 
||  operator<(const reverse_iterator<_Iterator>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|298 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::reverse_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|348 col 5| note: candidate: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_IteratorR>&) 
||  operator<(const reverse_iterator<_IteratorL>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|348 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::reverse_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1089 col 5| note: candidate: template<class _IteratorL, class _IteratorR> bool std::operator<(const std::move_iterator<_Iterator>&, const std::move_iterator<_IteratorR>&) 
||  operator<(const move_iterator<_IteratorL>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1089 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::move_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_algobase.h|67| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_tree.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1095 col 5| note: candidate: template<class _Iterator> bool std::operator<(const std::move_iterator<_Iterator>&, const std::move_iterator<_Iterator>&) 
||  operator<(const move_iterator<_Iterator>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_iterator.h|1095 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::move_iterator<_Iterator>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\map|60| 0, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|1293 col 5| note: candidate: template<class _Key, class _Val, class _KeyOfValue, class _Compare, class _Alloc> bool std::operator<(const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&, const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>&) 
||  operator<(const _Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|1293 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\string|52| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/stdexcept:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/array:38, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/tuple:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4982 col 5| note: candidate: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) 
||  operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4982 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\string|52| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/stdexcept:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/array:38, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/tuple:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4994 col 5| note: candidate: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&, const _CharT*) 
||  operator<(const basic_string<_CharT, _Traits, _Alloc>& __lhs, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|4994 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\string|52| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/stdexcept:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/array:38, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/tuple:39, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|5006 col 5| note: candidate: template<class _CharT, class _Traits, class _Alloc> bool std::operator<(const _CharT*, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) 
||  operator<(const _CharT* __lhs, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\basic_string.h|5006 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: mismatched types 'const _CharT*' and 'std::_List_iterator<int>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\tuple|39| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/bits/stl_map.h:63, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\array|242 col 5| note: candidate: template<class _Tp, unsigned int _Nm> bool std::operator<(const std::array<_Tp, _Nm>&, const std::array<_Tp, _Nm>&) 
||  operator<(const array<_Tp, _Nm>& __a, const array<_Tp, _Nm>& __b) 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\array|242 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::array<_Tp, _Nm>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|63| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:61, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\tuple|928 col 5| note: candidate: template<class ... _TElements, class ... _UElements> constexpr bool std::operator<(const std::tuple<_Args1 ...>&, const std::tuple<_Args2 ...>&) 
||  operator<(const tuple<_TElements...>& __t, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\tuple|928 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::tuple<_Args1 ...>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\map|61| 0, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|1087 col 5| note: candidate: template<class _Key, class _Tp, class _Compare, class _Alloc> bool std::operator<(const std::map<_Key, _Tp, _Compare, _Alloc>&, const std::map<_Key, _Tp, _Compare, _Alloc>&) 
||  operator<(const map<_Key, _Tp, _Compare, _Alloc>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_map.h|1087 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::map<_Key, _Tp, _Compare, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\map|62| 0, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_multimap.h|988 col 5| note: candidate: template<class _Key, class _Tp, class _Compare, class _Alloc> bool std::operator<(const std::multimap<_Key, _Tp, _Compare, _Alloc>&, const std::multimap<_Key, _Tp, _Compare, _Alloc>&) 
||  operator<(const multimap<_Key, _Tp, _Compare, _Alloc>& __x, 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_multimap.h|988 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::multimap<_Key, _Tp, _Compare, _Alloc>' 
||  { return __x < __y; } 
||     ^
In file included from C:\mingw32\i686-w64-mingw32\include\c++\list|63| 0, 
||     from ../src/main.cpp:2: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_list.h|1836 col 5| note: candidate: template<class _Tp, class _Alloc> bool std::operator<(const std::__cxx11::list<_Tp, _Alloc>&, const std::__cxx11::list<_Tp, _Alloc>&) 
||  operator<(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 
|| ^
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_list.h|1836 col 5| note: template argument deduction/substitution failed: 
In file included from C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_tree.h|65| 0, 
||     from C:/mingw32/i686-w64-mingw32/include/c++/map:60, 
||     from ../src/main.cpp:1: 
C:\mingw32\i686-w64-mingw32\include\c++\bits\stl_function.h|387 col 20| note: 'const std::_List_iterator<int>' is not derived from 'const std::__cxx11::list<_Tp, _Alloc>' 
||  { return __x < __y; } 
||     ^
Practical.make|106| recipe for target 'obj/Release/main.o' failed 
|| mingw32-make.exe[1]: *** [obj/Release/main.o] Error 1 
makefile|16| recipe for target 'Practical' failed 
|| mingw32-make.exe: *** [Practical] Error 2 

StackOverflowのは、私のメッセージはほとんどのコードですので、私はここに、この文を記述する必要が私に語りました。

+2

エラーメッセージが示すとおり、リストイテレータと演算子<を比較することはできません。これは、std :: mapが要素をソートするためにデフォルトで使用するものです。ベクトルはランダムアクセスイテレータを持っているので動作します。 –

答えて

8

std::listイテレータは、bidirectional iteratorsです。彼らはrandom access iteratorsのような比較をサポートしていません。

std::mapについては、となっているため、比較が必要です。マップはキーでソートされています。このソートが機能するには、キーを比較できる必要があります。前述したように、リストイテレータはそうではありません。

注文しない場合は、代わりにstd::unordered_mapを使用してください。一方、Angewが指摘したように、std::unordered_mapハッシュされたコンテナであり、動作させるにはstd::hashの特殊化が必要です。

+2

順序付けされていないマップには、手書きのハッシャが必要になる可能性があります。デフォルトでは 'std :: hash :: iterator>'が提供されているのではないでしょうか。 – Angew

+0

迅速な対応をありがとう! unordered_mapを使うと、実際には 'hash'のような単語のエラーでコンパイルされます。ハッシュ関数を書くのは難しいですか?または、おそらく、stdから他のデータ構造を使用することになります。 – user3496846

+1

@ user3496846私たちはあなたが何か他のものを見つけたり使うのを手助けできるように、私たちは元の問題が何であるか、あなたが必要とするものを知る必要があります。ユースケースは何ですか?その情報を含めるように質問を編集してください。私たちはその情報をお手伝いできるかもしれません。適切なハッシュ関数を作成する方法については、私は[std :: hash' specialization(http://stackoverflow.com/a/18079061/440558)を作成する方法を知っていますが、実際の実装ではあなたを助けることはできません。おそらく、イテレータが "ポイント"するデータを使用します( 'return std :: hash ()(* iterator)')? –

関連する問題