Saya hanya perlu kamus atau array asosiatif string
=> int
.
Ada tipe peta C ++ untuk kasus ini.
Tetapi saya hanya membutuhkan satu peta untuk semua contoh (-> statis) dan peta ini tidak dapat diubah (-> const);
Saya telah menemukan cara ini dengan perpustakaan boost
std::map<int, char> example =
boost::assign::map_list_of(1, 'a') (2, 'b') (3, 'c');
Apakah ada solusi lain tanpa lib ini? Saya telah mencoba sesuatu seperti ini, tetapi selalu ada beberapa masalah dengan inisialisasi peta.
class myClass{
private:
static map<int,int> create_map()
{
map<int,int> m;
m[1] = 2;
m[3] = 4;
m[5] = 6;
return m;
}
static map<int,int> myMap = create_map();
};
v = k + 'a' - 1
.Jawaban:
sumber
Boost.Assign
desain like juga lumayan rapi :)cout << A::myMap[1];
ke dalammain()
. Ini memberi kesalahan. Kesalahan tidak terjadi jika saya menghapusconst
qualifier, jadi saya kira mapoperator[]
tidak dapat menanganiconst map
, setidaknya, tidak dalam implementasi g ++ pustaka C ++.const_map.cpp:22:23: error: passing ‘const std::map<int, int>’ as ‘this’ argument of ‘std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const key_type&) [with _Key = int; _Tp = int; _Compare = std::less<int>; _Alloc = std::allocator<std::pair<const int, int> >; std::map<_Key, _Tp, _Compare, _Alloc>::mapped_type = int; std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]’ discards qualifiers [-fpermissive]
Standar C ++ 11 memperkenalkan inisialisasi seragam yang membuatnya lebih sederhana jika kompiler Anda mendukungnya:
Lihat juga bagian ini dari Professional C ++ , di unordered_maps.
sumber
Saya melakukannya! :)
Bekerja dengan baik tanpa C ++ 11
sumber
Jika Anda merasa
boost::assign::map_list_of
berguna, tetapi tidak dapat menggunakannya karena alasan tertentu, Anda dapat menulis sendiri :Sangat berguna untuk mengetahui bagaimana hal-hal seperti itu bekerja, terutama ketika mereka sangat pendek, tetapi dalam kasus ini saya akan menggunakan sebuah fungsi:
a.hpp
a.cpp
sumber
Pendekatan berbeda untuk masalah ini:
Ini lebih efisien, karena tidak ada salinan satu tipe dari tumpukan ke heap (termasuk konstruktor, penghancur pada semua elemen). Apakah ini penting atau tidak tergantung pada kasus penggunaan Anda. Tidak masalah dengan string! (tetapi Anda mungkin atau mungkin tidak menemukan versi "lebih bersih" ini)
sumber
Jika peta hanya berisi entri yang diketahui pada waktu kompilasi dan kunci peta adalah bilangan bulat, maka Anda tidak perlu menggunakan peta sama sekali.
sumber
switch
sangat buruk. Mengapa tidakreturn key + 'a' - 1
?return key + 'a' - 1
itu tidak akan berhasil untuk pemetaan sebenarnya.Anda bisa mencoba ini:
MyClass.h
MyClass.cpp
Dengan implementasi ini, peta statis konstan kelas Anda adalah anggota privat dan dapat diakses oleh kelas lain menggunakan metode get publik. Jika tidak, karena konstan dan tidak dapat diubah, Anda dapat menghapus metode get publik dan memindahkan variabel peta ke bagian kelas publik. Namun saya akan membiarkan metode createMap pribadi atau dilindungi jika pewarisan dan atau polimorfisme diperlukan. Berikut beberapa contoh penggunaan.
Saya telah mengedit posting asli saya, tidak ada yang salah dengan kode asli yang saya posting untuk itu terkompilasi, dibangun dan berjalan dengan benar, hanya saja versi pertama saya yang saya sajikan sebagai jawaban peta dinyatakan sebagai publik dan peta itu const tetapi tidak statis.
sumber
Jika Anda menggunakan kompiler yang masih tidak mendukung inisialisasi universal atau Anda memiliki reservasi untuk menggunakan Boost, alternatif lain yang memungkinkan adalah sebagai berikut
sumber
Panggilan fungsi tidak bisa muncul dalam ekspresi konstan.
coba ini: (hanya sebuah contoh)
sumber
static map<int,int> myMap = create_map();
salah.struct testdata { testdata(int){} }; struct test { static const testdata td = 5; }; testdata test::td;
itu akan gagal untuk dikompilasi bahkan jika inisialisasi dilakukan dengan ekspresi konstan (5
). Artinya, 'ekspresi konstan' tidak relevan dengan kebenaran (atau kurangnya itu) dari kode awal.Saya sering menggunakan pola ini dan menyarankan Anda untuk menggunakannya juga:
Tentu itu tidak terlalu bisa dibaca, tapi tanpa libs lain yang terbaik yang bisa kita lakukan. Juga tidak akan ada operasi yang berlebihan seperti menyalin dari satu peta ke peta lain seperti dalam upaya Anda.
Ini bahkan lebih berguna di dalam fungsi: Dari pada:
Gunakan yang berikut ini:
Tidak hanya Anda tidak perlu di sini untuk berurusan dengan variabel boolean lagi, Anda tidak akan menyembunyikan variabel global yang diperiksa jika penginisialisasi variabel statis di dalam fungsi sudah dipanggil.
sumber