2011-08-01 19 views
0
map<string, string> info; 

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

このようなマップをC++で初期化するにはどうすればよいでしょうか?このようなマップをC++で初期化するにはどうすればよいでしょうか?

EDIT:これは、C++ライブラリや追加コードなしで実行したいです。このような何か:

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

いいですか? – EvilTeach

+5

'info [" name "] =" something "; // please' – interjay

+0

{key:value、key:value}のようなものがよく見えます。 – Greta

答えて

1

あなたは、テキストファイルまたは(例えば、key(tab)value)事前に定義された構文を使用して、リソースファイルから値をロードすることでこれを行うことができます。

あなたのテキスト/リソースは次のようになります:

name something 
id  5665 

そして、あなただけのループ内で行ごとにそれを解析したいです。

正規表現があれば、簡単に(.+)\s(.+)と入力します。グループ1が自分のキーに一致し、グループ2が自分の値に一致します。

5

非常に良く、あなたがこれを行うことができます:

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

を個人的に、私はこれは読みやすさを痛いと思うし、あなたはそれを通常の方法で行う方がいいでしょう。

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_; 
    } 
}; 
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"); 
} 
0

この類似の質問への私の答えを参照してくださいhere

これはC++ 0xで非常に簡単です。

関連する問題