2012-01-08 20 views

cevap

92

işaretçileri geçerli yineleyiciler olduğunu unutmayın iki iterators alır vector yapıcı kullanın ve işaretçiler dizilerinden örtük dönüştürme kullanın: sizeof x/sizeof x[0] besbelli 3 olduğu

int x[3] = {1, 2, 3}; 
std::vector<int> v(x, x + sizeof x/sizeof x[0]); 
test(v); 

veya

test(std::vector<int>(x, x + sizeof x/sizeof x[0])); 

bu içerikte; Bir dizi içindeki elemanların sayısını almanın genel yolu. x + sizeof x/sizeof x[0], son öğenin ötesindeki bir öğeyi işaret ettiğine dikkat edin.

+1

Açıklayabilir misiniz lütfen? Zaten a (5,10) vektörünü okudum; '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '• '' '' 10'luk bir başlangıç ​​yapın ve x ile xı başlatın. açıklayabilir misin? – UnKnown

11

İşaretçiler başka yineleyiciler gibi kullanılabilir : Şahsen

int x[3] = {1, 2, 3}; 
std::vector<int> v(x, x + 3); 
test(v) 
+2

Gerçek hayatta, dizi boyutunu belirtmek isteyebilirsiniz, örneğin dizi boyutunu belirtmek için const const_t X_SIZE = 3; 'ifadesini kullanmak ya da sizeofden hesaplamak için. Okunabilirlik adına o bölümü ihmal ettim. –

77

, oldukça C++ 2011 yaklaşım gibi o sizeof() ne de dizi sınırlarını ayarlama hatırlamak eğer hiç değişiklik kullanmanızı gerektirir ne çünkü dizi sınırları (ve sen de ++ 2003 istersen C ilgili işlev tanımlayabilirsiniz):

#include <iterator> 
#include <vector> 
int x[] = { 1, 2, 3, 4, 5 }; 
std::vector<int> v(std::begin(x), std::end(x)); 

Açıkçası, C++, 2011 ile yine başlatıcı listeleri kullanmak isteyebilirsiniz:

std::vector<int> v({ 1, 2, 3, 4, 5 }); 
+1

diziyi kopyalıyor mu yoksa sadece işaret ediyor mu? –

+1

'std :: vector ' performansıyla ilgileniyorum, her zaman 'T' nesnelerine sahiptir. Bunun iki sonucu vardır: bir vektöre nesne eklerken kopyalanırlar ve bellekte yer değiştirirler. Makul küçük nesneler için, ör. Kısa dizilerin dizileri, sıralama önemli bir performans artışıdır. Nesneleriniz kopyalamak için büyük ve pahalıysa, nesneler için [bir şekilde kaynak yönetilen] işaretçiler saklamak isteyebilirsiniz. Hangi yaklaşım daha etkilidir, nesneye bağlıdır ama siz seçiminiz var. –

+0

Yani bir C++ ve c kütüphaneleri ve c-array vektör ve geri kopyalamak istiyorsanız, 2 kopya ceza ödeme yolu yoktur?(Ben eigen kütüphanesi ve gsl kullanıyorum) –

4

Burada yanlış soru soruyorsunuz - her şeyi bir vektöre zorlamak yerine, belirli bir kapsayıcı yerine yineleyicilerle çalışmaya nasıl dönüştürebileceğinizi sorun. Sen uyumluluğu korumak için çok aşırı yüklenmeye sağlamak (ve ücretsiz olarak aynı anda diğer kaplar ele) olabilir:

void test(const std::vector<int>& in) { 
    // Iterate over vector and do whatever 
} 

olur:

template <typename Iterator> 
void test(Iterator begin, const Iterator end) { 
    // Iterate over range and do whatever 
} 

template <typename Container> 
void test(const Container& in) { 
    test(std::begin(in), std::end(in)); 
} 

sağlar yapmanız:

int x[3]={1, 2, 3}; 
test(x); // Now correct 

(Ideone demo)

+0

"her şeyi bir vektöre zorlamak yerine, testi belirli bir kapsayıcı yerine yineleyicilerle çalışmaya nasıl dönüştürdüğünüzü sorun." Bu neden daha iyi? – aquirdturtle

+0

@aquirdturtle Şimdi, sadece vektörleri desteklemek yerine, listeleri ve dizileri destekliyor ve kapsayıcıları destekliyor ve yineleyicileri ve aralıkları dönüştürüyorsunuz ... – Flexo

İlgili konular