Soru gerçekten oldukça açıklayıcı. Matematikteki vektörler hakkında belirsiz bir şekilde biliyorum, ancak C ++ vektörlerine olan bağlantıyı gerçekten göremiyorum.
Yanıtlar:
Bir vektörün matematiksel tanımı, S
n
belirli bir kümedeki ( S
) sıralı bir değerler dizisi olan kümenin bir üyesidir . C ++ 'ın vector
sakladığı şey budur .
std::vector
sağlamaz, 3. argüman std::vector
değerlerinin sıralı bir dizidir geçerli olabilir için std::list
, std::deque
, std::basic_string
vb
Buna vektör deniyordu çünkü Standart Şablon Kitaplığı'nın tasarımcısı Alex Stepanov, onu yerleşik dizilerden ayırmak için bir isim arıyordu. Şimdi bir hata yaptığını kabul ediyor, çünkü matematik sabit uzunluktaki bir sayı dizisi için zaten 'vektör' terimini kullanıyor. C ++ 11, matematiksel bir vektöre benzer şekilde davranan bir sınıf 'dizisi' getirerek bu hatayı birleştirir.
Alex'in dersi: Ne zaman bir şey söyleseniz çok dikkatli olun.
Bjarne Stroustrup'un C ++ Programlama Dili'nden bir alıntı :
" Valarray'in vektör olarak adlandırılması gerektiği, çünkü bu geleneksel bir matematiksel vektör olduğu ve bu vektöre dizi olarak adlandırılması gerektiği iddia edilebilir . Ancak, terminoloji bu şekilde gelişmedi."
Sadece muhtemelen neden çağrılmadığını söylemek için array
: Çünkü std::vector
dinamik bir boyutu var. Bir dizinin kavramsal olarak uzunluğu sabittir. Bu arada, sonraki C ++ Standardı std::array
, boyutu sabit olan ve düz bir dizi yerine tercih edilmesi gereken bir şablona sahiptir :
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array
iyi olmaz.
@MarkRuzon'dan gelen mükemmel yanıtı tamamlamak için:
Alex, şimdi std :: vector olarak adlandırılan şeye bir isim vermek için Scheme ve Common Lisp'in benzer veri yapılarına vermiş olduğu adı gözlemlediğini söyledi .
Daha sonra yanıldığını itiraf ediyor çünkü C ++ vektörünün matematikteki vektörlerle ilgisi yok.
Ayrıca, 50 kişilik bir topluluğun hatasını 5 milyonluk bir topluluğa soktuğunu, bu nedenle hatanın sonsuza dek kalacağını söylüyor.
Bu sadece isim. C ++ vektörü çok iyi (veya belki daha doğru) dinamik dizi veya yeniden boyutlandırılabilir dizi olarak adlandırılabilir, ancak bu ad basitçe seçildi . Bu vektör , matematikteki vektör ile aynı değildir, çünkü matematikte vektörler herhangi bir V kümesinin üyesidir, öyle ki bu sette iki önemli işlem tanımlanmıştır: + (vektörlerin toplanması) ve x (bir vektörün alandan bir skaler ile çarpımı F ) ve bu işlemler 8 aksiyomu karşılar :
Toplamanın çağrışımı
u + (v + w) = (u + v) + w
Toplamanın değişme özelliği
u + v = v + u
Eklemenin kimlik öğesi
Sıfır vektör adı verilen bir 0 ∈ V öğesi vardır , öyle ki tüm v ∈ V için v + 0 = v .
Eklemenin ters elemanları
Her v ∈ V için, v + (−v) = 0 olacak şekilde , v'nin toplamsal tersi olarak adlandırılan bir −v ∈ V öğesi vardır.
Skaler çarpmanın alan çarpımıyla uyumluluğu
a (bv) = (ab) v
Skaler çarpımın kimlik öğesi
1 h = V, 1 O anlamına gelir çarpımsal kimlik olarak F .
Vektör toplamaya göre skaler çarpmanın dağıtılabilirliği
a (u + v) = au + av
Alan toplamaya göre skaler çarpmanın dağıtılabilirliği
(a + b) v = av + bv
C ++ std::vector
hepsini destekler (doğrudan değil, C ++ özellikleri aracılığıyla), bu yüzden bir şekilde vektör olarak adlandırılabilir, ancak bu sadece konuşma dilidir ve örneğin "C ++ Programlama Dili"Vallaray
nde Bjarne Stroustrup tarafından işaret edilen bazılarını doğrudan destekler.
std::vector
, aritmetik işlemleri desteklemez ve bu nedenle, tüm bu özellikler a için tanımsızdır std::vector
. Yani a std::vector
bir vektör olarak nitelendirilmez. Onu arardım dynamic_array
ya resizable_array
da size ne olduğunu söyler.
Bir vektör, tümü aynı türden olan bir değerler dizisidir. Bu, matematikteki kullanımla hemen hemen aynı çizgide. Sanırım vektörlerin bazı ortak işlemleri desteklemesi gerektiği matematiksel fikir (örneğin, bir skaler ile toplama ve ölçekleme gibi) taşınmıyor, önemli olan esas olarak yapı.
Ayrıca, tam sayıları veya kayan noktaları depolamasını sağlarsanız, N boyutlu vektörleri depolamak için mükemmel bir tür olur. Sonuçta bir vektör, belirli bir sırada tutulan sayıların bir listesidir.
0.1
saklanamayacaktır, ancak matematikte bu değer gerçek sayılar kümesinin bir üyesidir. Java programlama dilinde ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) bir vektör, "Vector sınıfı büyütülebilir bir nesne dizisi uygular. Bir dizi gibi, bir tamsayı dizini kullanılarak erişilebilir. Bununla birlikte, Vector oluşturulduktan sonra öğe ekleme ve çıkarma işlemlerine uyum sağlamak için bir Vector öğesinin boyutu büyüyebilir veya küçülebilir. "
Uzun zaman önce, B dilinde vektör türleri vardır. Sonra C dili onlara "diziler" adını verdi. Sonra Sınıfları olan C ve C ++ dili onu türetti ...
Bu kesinlikle hikayenin tamamı değil. Yukarıda belirtildiği gibi, asıl kararı Stepanov verdi. Ama "vektör" hala C'de kullanılıyorsa, sonuç oldukça farklı görünebilir.
PS. C'nin neden "dizi" adını değiştirdiğini merak ediyorum. Kesin nedeni neydi?
PS2. C ++ olarak bir dil için IMO, bir dizi, "[] işleci aracılığıyla makul bir şekilde erişilebilecek bir tür tutma öğeleri" anlamına gelir (yani, 42 [bir_dizisi_nesnesi] değil), örneğin, "ilişkilendirilebilir dizi" olarak std :: eşlemenin somutlaştırılması.
Sanırım satır vektör teriminden geliyor . Ayrıca, bilgisayar bilimcileri bir şeyler için yeni isimler düşünmeyi severler ...
ancak matematiksel vektörler dinamik değildir, geleneksel diziler daha iyi vektörler oluşturuyorsa, 2B'den 3B'ye veya başka herhangi bir şeye bir değişiklik görmedim.
Gerçek neden hakkında hiçbir fikrim yok, ancak C ++ 'nın bir dizi yerine vektör olarak adlandırılması, aynı rolleri yerine getirmelerine rağmen C ve C ++ yapıları arasındaki karışıklığı azaltır.
Bir C ++ vektörünü dinamik bir dizi olarak düşünün; boyut, öğeler eklenerek veya kaldırılarak değiştirilebilir. Vektörün matematiksel tanımıyla ilgili değildirler.
Matematikte Vektörler
Bir göz önünde nxm
matrisini A
, burada n
satır sayısı ile aynıdır, ve m
sütun sayısı ile aynıdır. Matematiksel bir bağlamda, bunun gibi bir matrisi sunduğunuzda, daha sonra, A
aralığı dışında herhangi bir işlem yapamazsınız ve A
boyutunu da genişletemezsiniz . Bunun anlamı, bir [n + 1]
ve / veya dizinine başvuramazsınız [m + 1]
.
Şimdi, A
boyutları her zaman 1xm
( [i]
içinde seçilen herhangi bir satır A
) veya nx1
( [j]
içinde seçilen herhangi bir sütun ) olurken , bir vektör de bu öznitelikleri türetir A
. Bir vektör şu şekilde de belirtilemez 2xn
, çünkü bir vektörler koleksiyonu tek bir vektör olarak yorumlanamazken , bir vektör - bu boyutları olan [i]
sütun vektörü olsun - bir matris olarak yorumlanabilir.A
1xm
Önemli olan çıkarım, bir vektörün boyutlarını matematik açısından tanıtıldıktan sonra değiştiremeyeceğinizdir.
C ++ 'da vektörler
C ++ 'da vektörler matematikteki vektörler gibidir, ancak matematikten farklı olarak boyutları değiştirilebilir . Bir terim olarak boyut burada geçerlidir çünkü belirli bir vektörün içerdiği öğe sayısını ifade eder.
Eğer vektörlerin vektör var olduğunda, C ++ vektörler cinsinden vadeli boyutlarını kullanın: std::vector<std::vector<T>>> ragged_array
. Bu örnekte, bu vektörü "düzensiz" olarak adlandırdım, çünkü bu vektörün her bir vektörünün boyutunun bağımsız olarak nasıl değiştirilebileceğini gösteriyor. Yalnızca belirli bir vektör matematiğe girdikten sonra boyutların nasıl değiştirilemeyeceğinin kurallarını ihlal etmekle kalmaz, aynı zamanda matris olarak nasıl kullanılamayacağını da gösterir.
Türler üzerindeki parametrizasyonun isimlere yaptığı mucizeler ..
burada bir sütun patlıyor .. (bazı sunucu tarafı ASP.NET HTML kodlama becerileri için kaynağı görüntüleyin)
yoksa sıra mıydı?
Sonra tekrar, bunu MIMD veya hatta SSE vektör makinesi bağlamında düşünürsek, isim hala kulağa çok iyi geliyor.