在C ++中初始化这样的地图有什么更好的方法?

时间:2011-08-01 20:42:13

标签: c++ map

map<string, string> info;

info["name"] = "something";
info["id"] = "5665";

在C ++中初始化这样的地图有什么更好的方法?

编辑:我想在没有任何c ++库或额外代码的情况下这样做。像这样:

info["name", "id"] = {"something", "5665"};

7 个答案:

答案 0 :(得分:5)

使用Boost.Assignment库,您可以执行以下操作:

map<string,int> m; 
insert( m )( "Bar", 1 )( "Foo", 2 );

就我个人而言,我认为这会伤害可读性,而且你最好以正常的方式做这件事。

答案 1 :(得分:4)

查看C++0x initializer list功能。好多了:))

答案 2 :(得分:3)

Boost.Assign可能是C ++ 03中最好的。

#include <boost/assign/list_of.hpp>
#include <map>
#include <string>

int main()
{
    using namespace std;
    map<string, string> info = boost::assign::map_list_of("name", "something")("id", "5665");
}

答案 3 :(得分:1)

您可以通过使用预定义语法(例如key(tab)value)加载文本文件或资源文件中的值来完成此操作。

您的文字/资源看起来像这样:

name    something
id      5665

你只需要在一个循环中逐行解析它。

如果您有正则表达式,可以使用简单的(.+)\s(.+),其中第1组与您的键匹配,第2组与您的值匹配。

答案 4 :(得分:1)

最好的方法是使用C ++ 0x初始化列表。但是如果你的编译器还没有实现这个功能,你可以使用类似下面的类

/**
 * Class that creates an std::map using a chained list syntax. For example:
 *
 * @code
 *
 *    std::map<int, int> SomeMap = MapInit<int, int>(1, 10)(2, 20)(3, 30);
 *
 * @endcode
 *
 * @tparam Key
 *    The key data type to be stored in the map.
 * @tparam Type
 *    The element data type to be stored in the map.
 * @tparam Traits
 *    The type that provides a function object that can compare two element values as sort keys to
 *    determine their relative order in the map. This argument is optional and the binary predicate
 *    less<Key> is the default value.
 * @tparam Allocator
 *    The type that represents the stored allocator object that encapsulates details about the map's
 *    allocation and deallocation of memory. This argument is optional and the default value is
 *    allocator<pair <const Key, Type> >.
 */
template< class Key, class Type, class Traits = std::less<Key>,
          class Allocator = std::allocator< std::pair <const Key, Type> > >
class MapInit
{
  /** Local map instance used to construct the output map */
  std::map<Key, Type, Traits, Allocator> myMap_;

  /* Disallow default construction */
  MapInit();
  /* Disallow copy construction */
  MapInit( const MapInit& );
  /* Disallow assignment */
  MapInit& operator=( const MapInit& );

public:
  /** An alias for the type of this object */
  typedef typename MapInit<Key, Type, Traits, Allocator>              self_type;
  /** An alias for the key-value pairs being stored in the map */
  typedef typename std::map<Key, Type, Traits, Allocator>::value_type value_type;

  /**
   * Constructor that accepts a key and value to be inserted in the map
   *
   * @param[in] key
   *    The key value of the element that is to be inserted
   * @param[in] value
   *    The element to be inserted
   */
  MapInit( const Key& key, const Type& value )
  {
    myMap_[key] = value;
  }


  /**
   * Constructor that accepts a key-value pair to be inserted into the map
   *
   * @param[in] kvpair
   *    The key-value pair to be inserted
   */
  MapInit( const value_type& kvpair )
  {
    myMap_[kvpair.first] = kvpair.second;
  }


  /**
   * Function call operator overload that accepts a key and value to be inserted in the map
   *
   * @param[in] key
   *    The key value of the element that is to be inserted
   * @param[in] value
   *    The element to be inserted
   *
   * @return Reference to the operand after inserting the element into the std::map
   */
  self_type& operator()( const Key& key, const Type& value )
  {
    myMap_[key] = value;
    return *this;
  }


  /**
   * Function call operator overload that accepts a key-value pair to be inserted in the map
   *
   * @param[in] kvpair
   *    The key-value pair to be inserted
   *
   * @return Reference to the operand after inserting the key-value pair into the std::map
   */
  self_type& operator()( const value_type& kvpair )
  {
    myMap_[kvpair.first] = kvpair.second;
    return *this;
  }


  /**
   * Typecast operator to convert the operand to an std::map
   *
   * @return The std::map constrcuted by the operand
   */
  operator std::map<Key, Type, Traits, Allocator>()
  {
    return myMap_;
  }
};

答案 5 :(得分:1)

Boost assign是进行STL容器初始化的最佳方式之一:

std :: vector,set,map的一些好例子可以在这里找到:

http://www.boost.org/doc/libs/1_47_0/libs/assign/doc/index.html#examples

答案 6 :(得分:0)

请参阅我对此类似问题的回答here

这在C ++ 0x中非常容易。