Soru Haritadan değer al


Ben bir harita var yani valueMap

typedef std::map<std::string, std::string>MAP;
MAP valueMap;
...
//Entering data

Sonra bu haritayı referansla bir işleve geçiriyorum

void function(const MAP &map)
{
  std::string value = map["string"];
  // by doing so i am getting error.
}

Bir işleve referans olarak aktarılan haritadan değeri nasıl alabilirim?


33
2018-05-22 09:54


Menşei


Aldığınız bir hata hakkında bilgi verirken, her zaman sorudaki asıl hatayı eklemelisiniz. - Some programmer dude
tamam. Bunun çaresine bakacağım. Teşekkürler - Aneesh Narayanan


Cevaplar:


ne yazık ki std::map::operator[] const olmayan bir üye işlevidir ve bir const referansınız vardır.

Ya imzayı değiştirmeniz gerekiyor function ya da yap:

MAP::const_iterator pos = map.find("string");
if (pos == map.end()) {
    //handle the error
} else {
    std::string value = pos->second;
    ...
}

operator[] Hatayı, haritaya varsayılan yapılandırılmış bir değer ekleyerek ve ona bir başvuru döndürerek işler. Tüm sahip olduğunuz bir yapı referansı olduğunda bu hiç bir işe yaramaz, bu yüzden farklı bir şey yapmanız gerekecek.

Sen could olasılığı görmezden gel ve yaz string value = map.find("string")->second;eğer program mantığınız bir şekilde bunu garanti ediyorsa "string" zaten bir anahtardır. Açık olan problem şudur: eğer yanlışsanız, tanımlanmamış davranışlar elde edersiniz.


55
2018-05-22 09:59



kullanım MAP::const_iterator içi auto Derleyiciniz desteklemiyorsa auto Henüz. - smerlin
olmamalı std::string value = pos->second; veya const std::string& value = pos->second;? - smerlin
@smerlin: iyi nokta, sabit. Sorgunun gerçekten değerin bir kopyasına ihtiyacı olup olmadığı veya bir const referansı kullanıp kullanamayacağı, gösterilmeyen kodlara bağlıdır. Bu yüzden onunla uğraşmaya karar verdim :-) - Steve Jessop


map.at ("key") anahtar eksikse istisna atar

Eğer k konteynerdeki herhangi bir elemanın anahtarı ile uyuşmuyorsa   işlev bir out_of_range özel durumu atar.

http://www.cplusplus.com/reference/map/map/at/


13
2018-01-13 07:12