উত্তর:
সি ++ 11 ব্যবহার করে:
#include <map>
using namespace std;
map<int, char> m = {{1, 'a'}, {3, 'b'}, {5, 'c'}, {7, 'd'}};
বুস্ট.অ্যাসাইন ব্যবহার করুন :
#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;
}
};
ব্যবহার:
স্টাড :: ম্যাপ মাইম্যাপ = তৈরি_ম্যাপ <ইন, ইনট> (1,2) (3,4) (5,6);
উপরের কোডটি গ্লোবাল ভেরিয়েবল বা কোনও শ্রেণীর স্থিতিশীল সদস্যদের আরম্ভ করার জন্য সেরা কাজ করে যা প্রাথমিককরণ করা দরকার এবং এটি কখন ব্যবহার করা হবে তা আপনি জানেন না তবে আপনি নিশ্চিত করতে চান যে মানগুলি এতে উপলব্ধ।
যদি বলে, আপনি একটি বিদ্যমান স্ট্যান্ড :: ম্যাপে উপাদানগুলি সন্নিবেশ করিয়ে পেয়েছেন ... আপনার জন্য এখানে আরও একটি ক্লাস রয়েছে।
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);
এটি এখানে জিসিসি 4.7.2 এর সাথে ক্রিয়াতে দেখুন: http://ideone.com/3uYJiH
###########################################################
সম্পাদনা : 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 :: মানচিত্র <int, int> আমার_ম্যাপ; // পরে কোথাও কোড বরাবর map_add_values <int- এ, int-> (my_map) (1,2) (3,4) (5,6);
দ্রষ্টব্য: পূর্বে আমি operator []
প্রকৃত মান যুক্ত করার জন্য একটি ব্যবহার করেছি। ডালে মন্তব্য হিসাবে এটি সম্ভব নয় not
#################################################################################################
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-উপাদানগুলির ডেটা কনস্ট্রাক্টর ব্যবহার করে। এটি আরম্ভ করার জন্য কোনও ফাংশনের প্রয়োজন নেই। কোনও তৃতীয় পক্ষের কোড (বুস্ট) নেই, কোনও স্ট্যাটিক ফাংশন বা অবজেক্ট নেই, কোন কৌশল নেই, কেবল সাধারণ সি ++:
#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);
যেহেতু আমি এই উত্তরটি লিখেছি সি ++ 11 আউট। আপনি এখন নতুন প্রারম্ভিক তালিকা বৈশিষ্ট্যটি ব্যবহার করে সরাসরি এসটিএল পাত্রে শুরু করতে পারেন:
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]" }
};
মানচিত্রটি যদি কোনও শ্রেণীর ডেটা সদস্য হয় তবে আপনি নিম্নলিখিত পদ্ধতিতে সরাসরি সিলেক্ট করতে পারেন (সি ++ 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
};
};
আমি একটি স্ট্যাটিক অবজেক্টের অভ্যন্তরে মানচিত্রটি গুটিয়ে রাখব এবং এই অবজেক্টটির কনস্ট্রাক্টারে মানচিত্রের সূচনা কোডটি রেখে দেব, আপনি নিশ্চিত হন যে আরম্ভের কোডটি কার্যকর করার আগে মানচিত্রটি তৈরি হয়েছিল।
কেবল একটি খাঁটি সি ++ 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);
আপনি যদি সি ++ 98 এর সাথে আটকে থাকেন এবং বুস্টটি ব্যবহার করতে না চান, এখানে স্থিতিশীল মানচিত্রের আরম্ভ করার দরকার হলে আমিই এখানে সমাধান করব solution
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 :: ফাংশন ব্যবহার করে লগ (এন) পারফরম্যান্স পেতে পারেন। যখন আমি এটি আগে পরীক্ষা করেছি তারা সাধারণত কোনও মানচিত্রের চেয়ে কমপক্ষে 4 গুণ দ্রুত সম্পাদন করে।
সুবিধাগুলি হ'ল ... - দ্রুত পারফরম্যান্স (* 4, আমি অনেকগুলি সিপিইউর প্রকারে পরিমাপ করেছি, এটি সর্বদা 4 এর কাছাকাছি থাকে) - সহজ ডিবাগিং। রৈখিক বিন্যাসে কী চলছে তা দেখা সহজ। - অনুলিপি অপারেশনগুলির তুচ্ছ বাস্তবায়ন, এটি প্রয়োজনীয় হওয়া উচিত। - এটি রান সময়ে কোনও স্মৃতি বরাদ্দ করে না, তাই এটি কখনও ব্যতিক্রম করবে না। - এটি একটি স্ট্যান্ডার্ড ইন্টারফেস, এবং তাই খুব সহজেই ডিএলএল, বা ভাষা ইত্যাদি ভাগ করে নেওয়া যায়
আমি যেতে পারি, তবে আপনি যদি আরও চান, তবে কেন স্ট্রোস্ট্রাপের বিষয়টিতে অনেকগুলি ব্লগ তাকান না।
map
(; প্রোগ্রামিং অর্থে, ধরনের কিন্তু, গাণিতিক অর্থে ফাংশন) একটি আংশিক ফাংশন প্রতিনিধিত্বমূলক একটি দরকারী ফর্ম। একটি অ্যারে তা করে না। আপনি বলতে পারবেন না, স্ট্রিং ব্যবহার করে অ্যারে থেকে ডেটা দেখার জন্য।