Ham verilere std :: vector pointer nasıl alınır?


160

Dizi std::vectorolarak kullanmaya çalışıyorum char.

Benim fonksiyonum geçersiz bir ibre alır:

void process_data(const void *data);

Sadece bu kodu kullanmadan önce:

char something[] = "my data here";
process_data(something);

Hangi beklendiği gibi çalıştı.

Ama şimdi dinamikliği gerekir std::vector, bu yüzden bunun yerine bu kodu denedim:

vector<char> something;
*cut*
process_data(something);

Soru, vektör ham verilerine erişebilmem için char vektörünü fonksiyonuma nasıl ileteceğim (hangi format olursa olsun - yüzer vb.)?

Bunu denedim:

process_data(&something);

Ve bu:

process_data(&something.begin());

Ama anlamsız verileri gösteren bir işaretçi döndü ve ikincisi uyarı verdi: warning C4238: nonstandard extension used : class rvalue used as lvalue.

Yanıtlar:


238

&somethingsize std::vectortuttuğu verilerin adresini değil, nesnenin adresini verir . &something.begin()tarafından döndürülen yineleyicinin adresini verir begin()(derleyici uyarıda bulunduğu gibi, teknik olarak izin verilmez, çünkü something.begin()bir değer ifadesi olduğundan adresi alınamaz).

Kabın içinde en az bir öğe olduğu varsayılarak, kabın üzerinden alabileceğiniz ilk öğenin adresini almanız gerekir.

  • &something[0]veya &something.front()(dizin 0'daki öğenin adresi) veya

  • &*something.begin()(tarafından döndürülen yineleyici tarafından gösterilen öğenin adresi begin()).

C ++ 11, yeni bir üye işlev ilave edildi std::vector: data(). Bu üye işlevi, tıpkı gibi, kaptaki ilk öğenin adresini döndürür &something.front(). Bu üye işlevinin avantajı, kap boş olsa bile çağrılmasının uygun olmasıdır.


103
Önemlivector<bool> Bu yanıtın istisnası olduğuna dikkat edin (ve bitişik bellek depolaması yoktur bool).
Motti

18
Parlak tarafta, dikkat edilmesi gereken çok şey yok: bu yöntemlerin üçü de derlenemez std::vector<bool>çünkü std::vector<bool>bir proxy nesnesinin kullanılmasını gerektirir ve bu proxy dolaylı olarak a dönüştürülemez bool*. Bunun çözümü olarak, bir diziye ihtiyacınız varsa bool, sadece a kullanmak en iyisidir std::vector<char>. @Motti
James McNellis

Doğru, dikkat genel olarak ve cevabınız olarak yönlendirilmemişti, çünkü bitişik bir bellek deposu olmadığından ona ulaşmanın bir yolu yoktur.
Motti

7
kapsamlı olmak için ama esas olarak .data()- Ben sadece ben bu çirkin görmedim gibi davranacağım &*iterator: P
underscore_d

2
işaretçi canlıdan ne kadar süre geri data()döner? Vektör asla daha büyük veya daha küçük olarak yeniden boyutlandırılmazsa (üzerinden push_back()veya diğer işlevler dahil reserve), işaretçinin vektör yaşadığı sürece doğru yere işaret edeceği garanti edilir mi?
johnbakers

81

something.data() vektörün veri alanına bir işaretçi döndürür.


error C2039: 'data' : is not a member of 'std::vector<_Ty>'
Çaylak

2
@Rookie: Bozuk bir derleyici kullandığınız anlaşılıyor - C ++ spesifikasyonundaki 23.3.6.3, vector :: data'yı tanımlar. Tedarikçinize bir hata vermeyi veya daha iyi bir derleyici almayı deneyin.
Chris Dodd

1
@Chris Dodd Aynı hatayı aldım. Visual Studio 2008 kullanıyorum.
bodacydo

34
@ChrisDodd: vector::data()C ++ 11 için yeni
HighCommander4

Visual Studio 2012 kullanın ve bir demet kullandıkları için vector :: data () eklemiş olmalısınız.
Robert Snyder

12

Bunun yerine ilk öğeye bir işaretçi götürün:

process_data (&something [0]);

Ben bile alt parantez olmadan ilk öğenin bellek adresini döneceğini düşündüm?
Tim

Bu diziler için, vektörler için değil.
Steven Don

Evet bunu fark ettim, üzgünüm.
Tim
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.