जवाबों:
C ++ 11 का उपयोग करना:
#include <map>
using namespace std;
map<int, char> m = {{1, 'a'}, {3, 'b'}, {5, 'c'}, {7, 'd'}};
Boost.Assign का उपयोग करना :
#include <map>
#include "boost/assign.hpp"
using namespace std;
using namespace boost::assign;
map<int, char> m = map_list_of (1, 'a') (3, 'b') (5, 'c') (7, 'd');
एक समारोह का उपयोग करने का सबसे अच्छा तरीका है:
#include <map>
using namespace std;
map<int,int> create_map()
{
map<int,int> m;
m[1] = 2;
m[3] = 4;
m[5] = 6;
return m;
}
map<int,int> m = create_map();
extern
चर में इसका सही मान नहीं होगा "मुख्य रन-टाइम निर्माता से पहले" यदि कंपाइलर केवल extern
घोषणा को देखता है, लेकिन अभी तक वास्तविक चर परिभाषा में नहीं चला है ।
const map<int,int> m = create_map()
(और इसलिए, इनिशियलाइज़ेशन लिस्ट में एक क्लास के struct MyClass {const map<int, int> m; MyClass(); }; MyClass::MyClass() : m(create_map())
यह बढ़ावा देने के लिए कुछ समान बनाने के लिए एक जटिल मुद्दा नहीं है। यहां केवल तीन कार्यों के साथ एक वर्ग है, जिसमें निर्माणकर्ता शामिल है, यह बताने के लिए कि क्या बढ़ा (लगभग)।
template <typename T, typename U>
class create_map
{
private:
std::map<T, U> m_map;
public:
create_map(const T& key, const U& val)
{
m_map[key] = val;
}
create_map<T, U>& operator()(const T& key, const U& val)
{
m_map[key] = val;
return *this;
}
operator std::map<T, U>()
{
return m_map;
}
};
उपयोग:
std :: map mymap = create_map <int, int> (1,2) (3,4) (5,6);
उपरोक्त कोड वैश्विक चर या एक वर्ग के स्थिर सदस्यों के प्रारंभिककरण के लिए सबसे अच्छा काम करता है जिसे आरंभीकृत करने की आवश्यकता होती है और आपको इसका कोई मतलब नहीं है कि यह पहले उपयोग किया जाता है लेकिन आप यह आश्वस्त करना चाहते हैं कि इसमें मान उपलब्ध हैं।
यदि कहें, तो आपको मौजूदा std :: map ... में तत्वों को सम्मिलित करना है ... यहाँ आपके लिए एक और वर्ग है।
template <typename MapType>
class map_add_values {
private:
MapType mMap;
public:
typedef typename MapType::key_type KeyType;
typedef typename MapType::mapped_type MappedType;
map_add_values(const KeyType& key, const MappedType& val)
{
mMap[key] = val;
}
map_add_values& operator()(const KeyType& key, const MappedType& val) {
mMap[key] = val;
return *this;
}
void to (MapType& map) {
map.insert(mMap.begin(), mMap.end());
}
};
उपयोग:
typedef std::map<int, int> Int2IntMap;
Int2IntMap testMap;
map_add_values<Int2IntMap>(1,2)(3,4)(5,6).to(testMap);
इसे GCC 4.7.2 के साथ यहां देखें : http://ideone.com/3uYJiH
############### हर कोई इस समय से पहले है ################
EDIT : map_add_values
नीचे दिया गया वह वर्ग, जिसका मूल हल मैंने सुझाया था, जीसीसी 4.5+ की बात आने पर विफल हो जाएगा। मौजूदा मानचित्र में मान जोड़ने के लिए कृपया ऊपर दिए गए कोड को देखें ।
template<typename T, typename U>
class map_add_values
{
private:
std::map<T,U>& m_map;
public:
map_add_values(std::map<T, U>& _map):m_map(_map){}
map_add_values& operator()(const T& _key, const U& _val)
{
m_map[key] = val;
return *this;
}
};
उपयोग:
std :: map <int, int> my_map; // बाद में कहीं कोड के साथ map_add_values <int, int> (my_map) (1,2) (3,4) (5,6);
नोट: पहले मैंने operator []
वास्तविक मूल्यों को जोड़ने के लिए उपयोग किया था । यह संभव नहीं है क्योंकि डैल द्वारा टिप्पणी की गई है।
#################### OBSOLETE खंड का अंत ####################
operator[]
केवल एक ही तर्क लेता है।
error: conflicting declaration ‘map_add_values<int, int> my_map’
error: ‘my_map’ has a previous declaration as ‘std::map<int, int> my_map’
यहां एक और तरीका है जो 2-तत्व डेटा कंस्ट्रक्टर का उपयोग करता है। इसे आरम्भ करने के लिए किसी कार्य की आवश्यकता नहीं है। कोई 3 पार्टी कोड (बूस्ट), कोई स्थिर कार्य या ऑब्जेक्ट नहीं है, कोई चाल नहीं है, बस सरल सी ++:
#include <map>
#include <string>
typedef std::map<std::string, int> MyMap;
const MyMap::value_type rawData[] = {
MyMap::value_type("hello", 42),
MyMap::value_type("world", 88),
};
const int numElems = sizeof rawData / sizeof rawData[0];
MyMap myMap(rawData, rawData + numElems);
जब से मैंने यह उत्तर लिखा है C ++ 11 बाहर है। अब आप सीधे नए आरंभक सूची सुविधा का उपयोग करके STL कंटेनरों को आरंभिक कर सकते हैं:
const MyMap myMap = { {"hello", 42}, {"world", 88} };
उदाहरण के लिए:
const std::map<LogLevel, const char*> g_log_levels_dsc =
{
{ LogLevel::Disabled, "[---]" },
{ LogLevel::Info, "[inf]" },
{ LogLevel::Warning, "[wrn]" },
{ LogLevel::Error, "[err]" },
{ LogLevel::Debug, "[dbg]" }
};
यदि मानचित्र किसी वर्ग का डेटा सदस्य है, तो आप इसे हेडर में सीधे निम्नलिखित तरीके से (C ++ 17 के बाद से) प्रारंभ कर सकते हैं:
// Example
template<>
class StringConverter<CacheMode> final
{
public:
static auto convert(CacheMode mode) -> const std::string&
{
// validate...
return s_modes.at(mode);
}
private:
static inline const std::map<CacheMode, std::string> s_modes =
{
{ CacheMode::All, "All" },
{ CacheMode::Selective, "Selective" },
{ CacheMode::None, "None" }
// etc
};
};
मैं मानचित्र को किसी स्थिर ऑब्जेक्ट के अंदर लपेटूंगा, और इस ऑब्जेक्ट के कंस्ट्रक्टर में मैप इनिशियलाइज़ेशन कोड डालूँगा, इस तरह आप सुनिश्चित हैं कि मैप को इनिशियलाइज़ेशन कोड निष्पादित होने से पहले बनाया जाता है।
बस एक शुद्ध C ++ 98 के आसपास काम करना चाहते थे:
#include <map>
std::map<std::string, std::string> aka;
struct akaInit
{
akaInit()
{
aka[ "George" ] = "John";
aka[ "Joe" ] = "Al";
aka[ "Phil" ] = "Sue";
aka[ "Smitty" ] = "Yando";
}
} AkaInit;
तुम कोशिश कर सकते हो:
std::map <int, int> mymap =
{
std::pair <int, int> (1, 1),
std::pair <int, int> (2, 2),
std::pair <int, int> (2, 2)
};
{1, 2}
इसके बजाय छोटे सिंटैक्स का उपयोग कर सकते हैं std::pair<int, int>(1, 2)
।
यह PierreBdR
बिना नक़ल के समान है ।
#include <map>
using namespace std;
bool create_map(map<int,int> &m)
{
m[1] = 2;
m[3] = 4;
m[5] = 6;
return true;
}
static map<int,int> m;
static bool _dummy = create_map (m);
यदि आप C ++ 98 के साथ अटके हुए हैं और बूस्ट का उपयोग नहीं करना चाहते हैं, तो यहां एक समाधान है जिसका उपयोग मैं तब करता हूं जब मुझे एक स्थैतिक को शुरू करने की आवश्यकता होती है:
typedef std::pair< int, char > elemPair_t;
elemPair_t elemPairs[] =
{
elemPair_t( 1, 'a'),
elemPair_t( 3, 'b' ),
elemPair_t( 5, 'c' ),
elemPair_t( 7, 'd' )
};
const std::map< int, char > myMap( &elemPairs[ 0 ], &elemPairs[ sizeof( elemPairs ) / sizeof( elemPairs[ 0 ] ) ] );
आपके पास यहां कुछ बहुत अच्छे उत्तर हैं, लेकिन मैं मेरे पास हूं, यह "जब आप सभी जानते हैं कि एक हथौड़ा है" का मामला दिखता है ...
स्थैतिक मानचित्र को इनिशियलाइज़ करने का कोई मानक तरीका क्यों नहीं है, इसका सबसे सरल उत्तर यह है कि स्टैटिक मैप का उपयोग करने का कोई अच्छा कारण नहीं है ...
एक नक्शा एक संरचना है जिसे तत्वों के अज्ञात सेट के लिए तेजी से देखने के लिए डिज़ाइन किया गया है। यदि आप हाथ से पहले तत्वों को जानते हैं, तो बस एक सी-सरणी का उपयोग करें। यदि आप ऐसा नहीं कर सकते हैं, तो मानों को एक क्रमबद्ध तरीके से दर्ज करें, या उन पर सॉर्ट चलाएं। तब आप stl :: फ़ंक्शन का उपयोग करके लॉग (n) प्रदर्शन प्राप्त कर सकते हैं। जब मैंने इसका परीक्षण किया है तो वे सामान्य रूप से नक्शे से कम से कम 4 गुना तेज प्रदर्शन करते हैं।
फायदे कई गुना हैं ... - तेज प्रदर्शन (* 4, मैंने कई सीपीयू के प्रकारों को मापा है, यह हमेशा 4 के आसपास होता है) - सरल डिबगिंग। यह देखना आसान है कि रैखिक लेआउट के साथ क्या हो रहा है। - कॉपी संचालन के तुच्छ कार्यान्वयन, जो आवश्यक हो जाना चाहिए। - यह रन टाइम पर कोई मेमोरी आवंटित नहीं करता है, इसलिए कभी भी कोई अपवाद नहीं फेंकेगा। - यह एक मानक इंटरफ़ेस है, और इसलिए डीएलएल, या भाषाओं, आदि को साझा करना बहुत आसान है।
मैं आगे बढ़ सकता था, लेकिन यदि आप अधिक चाहते हैं, तो स्ट्रॉन्स्ट्रुप के कई ब्लॉगों पर नज़र न डालें।
map
आंशिक कार्य (गणितीय अर्थ में कार्य; लेकिन यह भी, प्रोग्रामिंग अर्थ में, की तरह) का प्रतिनिधित्व करने के लिए एक उपयोगी रूप है। एक सरणी ऐसा नहीं करती है। आप स्ट्रिंग का उपयोग करके किसी सरणी से डेटा देखने, कह नहीं सकते।