map<string, string> info;
info["name"] = "something";
info["id"] = "5665";
このようなマップをC++で初期化するにはどうすればよいでしょうか?このようなマップをC++で初期化するにはどうすればよいでしょうか?
EDIT:これは、C++ライブラリや追加コードなしで実行したいです。このような何か:
info["name", "id"] = {"something", "5665"};
map<string, string> info;
info["name"] = "something";
info["id"] = "5665";
このようなマップをC++で初期化するにはどうすればよいでしょうか?このようなマップをC++で初期化するにはどうすればよいでしょうか?
EDIT:これは、C++ライブラリや追加コードなしで実行したいです。このような何か:
info["name", "id"] = {"something", "5665"};
あなたは、テキストファイルまたは(例えば、key(tab)value
)事前に定義された構文を使用して、リソースファイルから値をロードすることでこれを行うことができます。
あなたのテキスト/リソースは次のようになります:
name something
id 5665
そして、あなただけのループ内で行ごとにそれを解析したいです。
正規表現があれば、簡単に(.+)\s(.+)
と入力します。グループ1が自分のキーに一致し、グループ2が自分の値に一致します。
C++0xinitializer list
の機能をご覧ください。 Boost.Assignmentライブラリを使用して:)
非常に良く、あなたがこれを行うことができます:
map<string,int> m;
insert(m)("Bar", 1)("Foo", 2);
を個人的に、私はこれは読みやすさを痛いと思うし、あなたはそれを通常の方法で行う方がいいでしょう。
最善の方法は、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_;
}
};
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");
}
ブーストアサインは、STLコンテナの初期化を行うためのneatest方法の一つである:
いくつかの良い例はstd ::ベクトル、セットのために、マップはここで見つけることができます:
http://www.boost.org/doc/libs/1_47_0/libs/assign/doc/index.html#examples
この類似の質問への私の答えを参照してくださいhere。
これはC++ 0xで非常に簡単です。
いいですか? – EvilTeach
'info [" name "] =" something "; // please' – interjay
{key:value、key:value}のようなものがよく見えます。 – Greta