10

std::pair の要素にアクセスするための事実上の標準 (つまり、TR1 または Boost) C++ 関数オブジェクトがあるかどうかは誰にもわかりませんか? keys過去 24 時間に 2 回、 Perl ハッシュの関数のようなものがあればいいのにと思いました。たとえば、std::map オブジェクトに対して std::transform を実行し、すべてのキー (または値) を別のコンテナーにダンプするとよいでしょう。もちろん、そのような関数オブジェクトを作成することもできますが、多くの注目を集めたものを再利用したいと考えています。

4

6 に答える 6

17

boost::bindあなたが探しているものです。

boost::bind(&std::pair::second, _1); // returns the value of a pair

例:

typedef std::map<std::string, int> map_type;

std::vector<int> values; // will contain all values
map_type map;
std::transform(map.begin(), 
               map.end(), 
               std::back_inserter(values), 
               boost::bind(&map_type::value_type::second, _1));
于 2008-12-16T22:03:10.377 に答える
4

あなたの質問の言い方からすると、これが適切な回答であるかどうかはわかりませんが、試してみてくださいboost::tie(Boost::tuple ライブラリの一部)。sでも動作しstd::pairます。

于 2008-12-16T21:08:31.390 に答える
3

boost::bindは、std::map コンテナーをアルゴリズムで使用するように適応させるためによく使用されます。以下に例を示します。

void print_string(const std::string& s) {
  std::cout << s << '\n';
}


std::map<int,std::string> my_map;
my_map[0]="Boost";
my_map[1]="Bind";


std::for_each(my_map.begin(), my_map.end(),
              boost::bind(&print_string, boost::bind(
              &std::map<int,std::string>::value_type::second,_1)));
于 2008-12-16T22:03:41.403 に答える
1

異なるコンテナを組み合わせて使用​​するのはどうですか。

たとえば、ベクターを補足マップに含まれるアイテムと、補足マップに含まれていないアイテムに分割したい場合は、次のようにしました。

typedef int DWORD; 
typedef std::pair<std::string, bool> user_info; 
typedef std::map<DWORD, user_info> USER_MAP; 
typedef std::vector<DWORD> VEC_STAFF; 

VEC_STAFF::iterator it = std::partition(Staff.begin(), Staff.end(), (bind(&USER_MAP::find, m_Users, _1) != m_Users.end()));

ここで 2 番目の問題があります。アプリケーションの実行中に user_info のステータス bool が変更される可能性があり、後で補足マップに含まれているだけでなく、true のステータス bool を持つアイテムでベクトルを再分割したいと考えています。 .

ただし、ネストされたペアの 2 番目の項目へのアクセスに問題があるようです。

次のことを試しましたが、ネストされたペアにアクセスできないようです!

CActiveUsers::VEC_STAFF::const_iterator itCurEnd = partition(Staff.begin(), Staff.end(), bind(&USER_MAP::value_type::second::second, bind(&USER_MAP::find, &m_Users, _1)) == true); 
于 2009-09-21T17:16:27.533 に答える
1

ブースト::アダプターを見てください。マップ キーまたは値を中間コンテナーにコピーせずに反復処理するための事前定義されたアダプターがあります。

于 2011-11-17T17:14:33.893 に答える
0

提案されなかった 1 つのオプションはstd::tr1::get. n1745のセクション 6.1.2 および 6.1.4 を参照してください。

std::pair< std::string, int > p( "foo", 1729 );

int hr = std::tr1::get< 1 >( p );

bindあなたが言及した抽出の場合ほど使いにくいことは間違いありませんmapが、それでも知っておく価値があります。ヨハネスのコードを適応させる:

typedef std::map<std::string, int> map_type;

std::vector<int> values; // will contain all values
map_type map;

// std::tr1::get is overloaded so we need to help the compiler choose
const map_type::value_type::second_type & (*get)( const map_type::value_type & ) =
  &std::tr1::get< 1, map_type::value_type::first_type, map_type::value_type::second_type >;

std::transform(map.begin(), 
               map.end(), 
               std::back_inserter(values), 
               get);
于 2011-11-18T18:15:33.827 に答える