C ++ const harita öğesi erişimi


102

Bir const C ++ haritasındaki öğeye [] erişim işlecini kullanmayı denedim, ancak bu yöntem başarısız oldu. Ben de aynı şeyi yapmak için "at ()" kullanmayı denedim. Bu sefer işe yaradı. Ancak, const C ++ haritasındaki öğeye erişmek için "at ()" kullanımı hakkında herhangi bir başvuru bulamadım. "At ()" C ++ haritasına yeni eklenen bir işlev mi? Bununla ilgili daha fazla bilgiyi nerede bulabilirim? Çok teşekkür ederim!

Bir örnek aşağıdaki olabilir:

#include <iostream>
#include <map>

using namespace std;

int main()
{
        map<int, char> A;
        A[1] = 'b';
        A[3] = 'c';

        const map<int, char> B = A;

        cout << B.at(3) << endl; // it works
        cout << B[3] << endl;  // it does not work

}

"B [3]" kullanmak için, derleme sırasında aşağıdaki hataları döndürdü:

t01.cpp: 14: hata: 'sabit std :: map, std :: ayırıcı>>' '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [ile _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'niteleyicileri atar

Kullanılan derleyici g ++ 4.2.1'dir.

Yanıtlar:


127

at()std::mapC ++ 11 için yeni bir yöntemdir .

operator[]Verilen anahtara sahip bir öğe yoksa yeni bir varsayılan oluşturulmuş öğe eklemek yerine , bir std::out_of_rangeistisna atar . (Bu, at()for dequeve davranışına benzer vector.)

Bu davranış nedeniyle , haritayı her zaman değiştirme potansiyeline sahip olandan farklı olarak constaşırı yük olması mantıklıdır .at()operator[]


Bir istisna atmak yerine "at" ın varsayılan bir değer döndürmesi mümkün müdür?
user1202136

Ben kullanıyorum at()VS2010 araç kullanmak için bir proje sette VS2013 içinde birlikte. Bunun C ++ 11 kullanmadığım anlamına geldiğini düşündüm ... Ama yine de derliyor ... ??
thomthom

1
Sadece haritayı değiştirmek yerine eşlenmemiş bir öğe için bir istisna atabilen const operatörünü [] çıkarmanın mantıklı olmadığını yorumlamam gerekiyor.
Spencer 18

@Spencer [] operatörünün const ve const olmayan aşırı yüklemelerinin farklı etkileri olsaydı şaşırtıcı olurdu. Normalde, bir programdaki bazı const olmayan nesneler veya referanslar const yapılırsa, programın derlendiği sürece aynı şekilde davranmaya devam etmesini bekleriz. Yalnızca const olmayan aşırı yüklemenin istisnalar atmasına izin vermek, çalışma zamanına kadar yakalanmayan hatalara neden olabilir.
Brian

@Brian "Yalnızca const aşırı yükünün istisnalar atmasına izin veriliyor" mu demek istediniz ?
Spencer

33

Bir öğe a'da yoksa map, operator []onu ekler - ki bu açıkçası bir constharitada çalışamaz, dolayısıyla C ++ constoperatörün bir sürümünü tanımlamaz . Bu, derleyicinin tür denetleyicisinin olası bir çalışma zamanı hatasını önleyen güzel bir örneğidir.

Sizin durumunuzda, findbunun yerine kullanmanız gerekir ki, eğer varsa, yalnızca bir (yineleyici) öğesi döndürür, asla map. Bir öğe yoksa, haritaya bir yineleyici döndürür end().

atyoktur ve derlenmemelidir. Belki de bu bir "derleyici uzantısıdır" (=bir böcek C ++ 0x'de yeni).


C ++ standardı, uygulamanın kütüphane sınıflarında standart olmayan ek üye işlevler tanımlamasını yasaklıyor mu?
Tim Martin

@Tim Arayüzün sabit olduğuna inanıyorum, evet.
Konrad Rudolph

4

[] -Operatör , verilen anahtar yoksa haritada yeni bir giriş oluşturacaktır . Böylece haritayı değiştirebilir.

Bu bağlantıya bakın .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.