代码之家  ›  专栏  ›  技术社区  ›  Michael Kristofik

是否有一个标准的C++函数对象来分离一个STD::对?

  •  10
  • Michael Kristofik  · 技术社区  · 17 年前

    有没有人知道是否有阿德事实标准(即Tr1或Boost)C++函数对象来访问STD::对的元素?在过去的24小时里,我曾两次希望我能拥有 keys Perl哈希函数。例如,最好在std::map对象上运行std::transform,并将所有键(或值)转储到另一个容器。我当然可以编写这样一个函数对象,但是我更愿意重用一些吸引了我很多眼球的东西。

    6 回复  |  直到 14 年前
        1
  •  17
  •   Johannes Schaub - litb    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));
    
        2
  •  4
  •   Head Geek    17 年前

    从你回答问题的方式来看,我不确定这是一个正确的回答,但是试试看。 boost::tie (Boost::Tuple库的一部分)。它工作在 std::pair S也是。

        3
  •  3
  •   Judge Maygarden    17 年前

    boost::bind 通常用于调整std::map容器以便与算法一起使用。 Here 就是一个例子:

    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)));
    
        4
  •  1
  •   Peter Nimmo    16 年前

    使用不同容器的组合怎么样?

    例如,当我想将一个向量划分为包含在补充映射中的项和不包含在补充映射中的项时,我使用了以下方法:

    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()));
    

    现在我还有第二个问题——在应用程序运行期间,用户信息的状态bool可能会改变,稍后我想用状态bool为true的项重新划分向量,而不仅仅是包含在补充映射中。

    但是,我似乎在访问嵌套对的第二个项时遇到问题。

    我尝试了以下操作,但似乎无法访问嵌套对!

    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); 
    
        5
  •  1
  •   Matt Chambers    14 年前

    看看Boost::适配器。有预先定义的适配器,用于在不将映射键或值复制到中间容器的情况下迭代映射键或值。

        6
  •  0
  •   Andrew Durward    14 年前

    一个没有被建议的选择是 std::tr1::get . 见第6.1.2和6.1.4节 n1745 .

    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);