VC++ 2008 SP1ではTR1ライブラリが追加されるそうなので、
(GNU g++でも使えるようになっているらしいし)そろそろ準備します。
VC++ 2008 SP1 ベータ1がなぜかインストールに失敗するので、
VC++ 2008英語版 + VC++ 2008 Feature Packを使って実験しました。
unordered_mapを例題に使ってみたのですが、
(いつもながら、g++の方がコンパイラのチェックが細かいというのを除けば)
ヘッダファイルの違いを除いて、VC++でもg++でもunordered_mapを
使えるようです。
いままで、hash_mapがVC++とg++で互換性がなくて敬遠していたので
ちょっとうれしいかも。
以下、両方のコンパイラで通ったソースを記します。
#if defined _MSC_VER
#include <unordered_map>
#elif defined __GNUC__
#include <tr1/unordered_map>
#endif
#include <string>
#include <iostream>
class MyKey {
public:
std::string value;
explicit MyKey(const std::string &v) : value(v) { }
MyKey() { }
MyKey(const MyKey &right) : value(right.value) { }
};
namespace std {
namespace tr1 {
template<>
struct hash<MyKey> {
size_t operator()(const MyKey& item) const {
return item.value.length();
}
};
}
}
namespace std {
template<>
struct equal_to<MyKey> {
typedef MyKey first_argument_type;
typedef MyKey second_argument_type;
typedef bool result_type;
bool operator()(const MyKey &left, const MyKey &right) const {
return left.value == right.value;
}
};
}
int main(int argc, char *argv[])
{
std::tr1::unordered_map<std::string, int> someMap;
someMap["one"] = 1;
someMap["two"] = 2;
std::cout << "one -> " << someMap["one"] << std::endl;
std::cout << "two -> " << someMap["two"] << std::endl;
std::tr1::unordered_map<MyKey, int> anotherMap;
anotherMap[MyKey("one")] = 1;
anotherMap[MyKey("two")] = 2;
std::cout << "one -> " << anotherMap[MyKey("one")] << std::endl;
std::cout << "two -> " << anotherMap[MyKey("two")] << std::endl;
return 0;
}
(GNU g++でも使えるようになっているらしいし)そろそろ準備します。
VC++ 2008 SP1 ベータ1がなぜかインストールに失敗するので、
VC++ 2008英語版 + VC++ 2008 Feature Packを使って実験しました。
unordered_mapを例題に使ってみたのですが、
(いつもながら、g++の方がコンパイラのチェックが細かいというのを除けば)
ヘッダファイルの違いを除いて、VC++でもg++でもunordered_mapを
使えるようです。
いままで、hash_mapがVC++とg++で互換性がなくて敬遠していたので
ちょっとうれしいかも。
以下、両方のコンパイラで通ったソースを記します。
#if defined _MSC_VER
#include <unordered_map>
#elif defined __GNUC__
#include <tr1/unordered_map>
#endif
#include <string>
#include <iostream>
class MyKey {
public:
std::string value;
explicit MyKey(const std::string &v) : value(v) { }
MyKey() { }
MyKey(const MyKey &right) : value(right.value) { }
};
namespace std {
namespace tr1 {
template<>
struct hash<MyKey> {
size_t operator()(const MyKey& item) const {
return item.value.length();
}
};
}
}
namespace std {
template<>
struct equal_to<MyKey> {
typedef MyKey first_argument_type;
typedef MyKey second_argument_type;
typedef bool result_type;
bool operator()(const MyKey &left, const MyKey &right) const {
return left.value == right.value;
}
};
}
int main(int argc, char *argv[])
{
std::tr1::unordered_map<std::string, int> someMap;
someMap["one"] = 1;
someMap["two"] = 2;
std::cout << "one -> " << someMap["one"] << std::endl;
std::cout << "two -> " << someMap["two"] << std::endl;
std::tr1::unordered_map<MyKey, int> anotherMap;
anotherMap[MyKey("one")] = 1;
anotherMap[MyKey("two")] = 2;
std::cout << "one -> " << anotherMap[MyKey("one")] << std::endl;
std::cout << "two -> " << anotherMap[MyKey("two")] << std::endl;
return 0;
}