2012-05-24 28 views
16

std :: vektörüne C dizisi olarak erişmek istediğinizde, bu örnekte görebileceğiniz gibi en az dört farklı yoldan birini seçebilirsiniz:std :: vector: vec.data() veya & vec [0]

#include <iostream> 
#include <vector> 

using namespace std; 

int main() { 
    std::vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(2); 
    vec.push_back(42); 
    vec.push_back(24024); 
    { 
    int* arr = vec.data(); 
    cout << arr << endl; /* output: 0x9bca028 */ 
    cout << arr[3] << endl; /* output : 24024 */ 
    } 
    { 
    int* arr = &vec.front(); 
    cout << arr << endl; /* output: 0x9bca028 */ 
    cout << arr[3] << endl; /* output : 24024 */ 
    } 
    { 
    int* arr = &vec[0]; 
    cout << arr << endl; /* output: 0x9bca028 */ 
    cout << arr[3] << endl; /* output : 24024 */ 
    } 
    { 
    int* arr = &vec.at(0); 
    cout << arr << endl; /* output: 0x9bca028 */ 
    cout << arr[3] << endl; /* output : 24024 */ 
    } 
} 

Çoğu durumda bulduğum, &vec[0]'dur. Sanırım en az zarif, bu yüzden ... neden en çok kullanılan? daha verimli veya daha uyumlu var mı? data() hakkında çok fazla belge bulamıyorum.

+1

operatöründe bulunan kullanıcıyı gizlemek için kullanılabilecek bir CAdapt şablon sınıfına sahiptir. (*) *, C++ 11 olduğu anlamında uyumsuz olarak kabul edilebilir. Büyük dokümantasyon kaynakları yeni özellikler ile yetişiyor gibi, kıt belgeleme), zaman kesinlikle bu uyumsuzluğun ortadan kalkmasını sağlayacaktır ve sonra gitmek için kesin bir yoldur. –

cevap

16

data() istediğiniz sıklıkta görmüyorum, bu yüzden C++ ile 11 yepyeni. &vec.front() kullanmama fikri bana hiç yaşanmadı, muhtemelen çok daha fazla front() (hemen hemen hiç) kullanıyorum. Sanırım diğer insanlar için aynı şey.

+0

Veri yapısı yok mu? –

+0

@MooingDuck: Yalnızca const vektörleri için, [Sanırım] (http://en.cppreference.com/w/cpp/container/vector/data). Şimdi test edeceğim. –

+7

@MooingDuck Hayır. Tam olarak insanlar eklenmek zorunda kalmayacak şekilde eklendi: v.empty()? NULL: & v [0] '. – bames53

14

sonra data() kullanarak, C++ 11 kullanıyorsanız kesinlikle tercih edilir. Özellikle, eğer vektör boşsa, diğer iki seçeneğin herhangi birini kullanarak tanımlanmamış bir davranış ortaya çıkar! C++ 11 kullanmıyorsanız ve vektör boş olabilirse, o durumu kontrol ettiğinizden emin olun.

1

C++ 11'ler std::array'dan önce std::vector C stili dizinin yerine kullanılacak en yaygın kapsayıcı olduğunu söyleyebilirim. [] işleci genellikle sabit zaman erişimi anlamına gelir (std::vector'un hepsi budur) ve çoğu kodlayıcı genellikle bu stili dizi benzeri erişim ve davranışı yansıtacak şekilde seçer. Okumak-up olabilir yani bu konuda

0

verileri() bir süredir std::string bir parçası olmuştur. Benzer olması için std::vector numaralı veri() uygulamasını buldum. Zaman zaman bir (std::string) işlenmemiş bayt dizisi olarak kullanmak için data() işlevini kullanırım.

4

& VEC kullanma [0] En yaygın olmasına rağmen, kabul ediyorum, biraz garip görünüyor olduğunu. Gelecek için akılda tutulması gereken bir şey. vektör olan sınıf operatörü & (overloads nesnelerin bir vektör) olması durumda, & VEC ararsanız bu tuhaf davranışlara neden olacağını fark [0].

Bu, nesnenin bitişik nesneler dizisindeki ilk öğenin başlangıç ​​adresini alamaz, vec [0] .operator &() öğesinin ne zaman döneceğini döndürür. Çoğu zaman olmasa da, aradığınız adres bu değil (Jedi el dalgası).

bu iyi bir örnek ATL'ın CComPtr olduğunu. Operatör &() 'u aşırı yükler, böylece bir vektörde saklamak sorunlu olabilir. Bunu aşmak için ATL, CComPtr

+2

+1 standardının bir parçası –

İlgili konular