無料の機能を備えたKeithBのソリューションが好きだった。しかし、より再利用可能なソリューションが良いかもしれません。
あなたはインスタンスの任意の名前を付けることができますよう、あなたが好きな、第一または第二のアクセス関数オブジェクトについて:
#include <map>
#include <string>
#include <iostream>
struct GetFirst
{
template <class First, class Second>
First& operator()(std::pair<First, Second>& p)
{
return p.first;
}
template <class First, class Second>
const First& operator()(const std::pair<First, Second>& p)
{
return p.first;
}
};
struct GetSecond
{
template <class First, class Second>
Second& operator()(std::pair<First, Second>& p)
{
return p.second;
}
template <class First, class Second>
const Second& operator()(const std::pair<First, Second>& p)
{
return p.second;
}
};
int main()
{
typedef std::map<std::string, int> Map;
Map persons;
persons["John"] = 20;
persons["Mary"] = 24;
//create named accessors
GetFirst name;
GetSecond age;
for (Map::iterator it = persons.begin(); it != persons.end(); ++it) {
std::cout << name(*it) << " is aging.\n";
++age(*it);
}
for (Map::const_iterator it = persons.begin(); it != persons.end(); ++it) {
std::cout << "Name: " << name(*it) << ", age: " << age(*it) << '\n';
}
}
これは私が何ができる最善の方法です。私はまた、それらのファンクターがイテレータを直接受け入れるようにしようとしましたが、これは、シグネチャに依存型の名前が含まれている可能性があることを意味します(つまり、Get34 C++ 0xのタイプ)。
面白い:現在、グラフに関する多くの質問があるようです:http://stackoverflow.com/questions/1499878/use-a-graph-library-node-network-library-or-roll-my-自分自身、http://stackoverflow.com/questions/1499217/boost-graph-as-basis-for-a-simple-dag-graph –
なぜブーストを使用できないのですか? –