C ++ Vector neden Vector olarak adlandırılır?


160

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.


6
Vektör kelimesini duyduğum anda aklıma gelen ilk şey fizikteki vektörler (Magnitute + yön).
RBT

Yanıtlar:


115

Bir vektörün matematiksel tanımı, Snbelirli bir kümedeki ( S) sıralı bir değerler dizisi olan kümenin bir üyesidir . C ++ 'ın vectorsakladığı şey budur .


21
Vektörler, fizikte kullanımları nedeniyle tipik olarak sadece 2-3 boyutlu kabul edilir. Ancak daha genel olarak matematikte, sıralı bir sayı kümesini kastetirler (matematiksel kümeler düzensizdir, içi dolu bir torba gibidirler). Bir vektörün herhangi bir sayıda öğesi olabilir.
Joseph Garvin

8
vartec, bir Öklid vektörü bir koordinat vektörü olarak temsil edilemez mi ve bunun tersi de geçerlidir? Bunlar aynı şeyin (bir demet) daha genel vektör uzayına karşı Öklid uzayındaki farklı temsilleridir.
Calvin

6
@Joseph Garvin: Vektörlerin sayı olan bileşenlere sahip olmasına bile gerek yok. Örneğin, bileşenlerin işlev olduğu vektör uzaylarını oluşturmak için belirli işlev kümeleri kullanılabilir.
jason

13
Bir vektör, kelimenin tam anlamıyla bir "taşıyıcıdır". Aynı kelime (örneğin) hastalığı ileten böcekler için kullanılır ve "araç" ile aynı Latince kökünden gelir. Yani sizi bir yerden diğerine götüren bir şey. Bu arada, "matrix" kelimesi de Latince'den geliyor ve "rahim" anlamına geliyor.
Artelius

11
Çünkü bu yetersiz görünüyor: 1. Matematiksel vektörler boyutta değişmez, 2. Matematiksel vektörler operasyonları var std::vectorsağlamaz, 3. argüman std::vectordeğerlerinin sıralı bir dizidir geçerli olabilir için std::list, std::deque, std::basic_stringvb
jamesdlin

203

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.


1
Ancak dizi, yığın tahsisini de kullanmaz, bu da onu daha az verimli bir şekilde taşımayı sağlar. Ayrıca std :: valarray, btw var.
sellibitze

1
Yığın üzerine tahsis edebilirsiniz ucuz hareket isteniyorsa.

2
Çok geç olmasına rağmen bu dersi aldıklarını bilmek güzel. Her ne kadar ... typedef veya #define da düzeltebilir.
LearnCocos2D

4
Bilgisayar Bilimi'nde sadece iki zor şey vardır: önbellek geçersiz kılma ve şeyleri adlandırmak - Phil Karlton
RBT

10
Cevabınızda "[Alex Stepanov] artık hata yaptığını kabul ediyor" şeklinde bir iddiada bulunacaksanız, lütfen bir alıntı yapar mısınız?
Trevor Boyd Smith

58

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."


53
Pfftt .. bu adam ne biliyor? Bu "Bjarne Stroustrup" kişisini hiç duymadım.
Calvin

5
Önceki yorumun kaç olumlu oyunun aslında bir
yetersizliğin

16

İsim, vektörün yalnızca bir sütun veya yalnızca bir satır içeren matris olduğu doğrusal cebirden gelir.


10

Sadece muhtemelen neden çağrılmadığını söylemek için array: Çünkü std::vectordinamik 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 };

Bu yeni C ++ standardı henüz piyasaya sürüldü mü?
Johannes Jensen

1
Bir vektörün boyutu da sabit olduğundan, bu pek bir cevap değildir. vektörler saf değerlerdir, bazı ek yapılarla birlikte soyut bir vektör uzayı oluşturan bir kümedeki öğelerdir. Bir vektörün "boyutunu değiştirme" kavramı tamamen saçmadır.
sara

@kai Sanırım burada bir karışıklık var. Sizden sadece neden olduğunu savunmuşlardır değil denilen dizi . Neden özellikle vektör olarak adlandırıldığını açıklamaya çalışmadım . Dilin standartlaştırılmasından önce bile C ++ 'daki bir dizi her zaman sabit bir boyuta sahipti, bu nedenle yeniden boyutlandırılabilir sınıfın adlandırılması std::arrayiyi olmaz.
Johannes Schaub -

şimdi haklı olarak bunun bir cevap değil, geçerli bir yorum olduğundan şikayet edebilirsiniz. Yorumunuzun ilk yarım cümlesine (virgül kadar) katılıyorum. Ancak, cevabımı soruya ilişkin bir yoruma taşımak için artık çok geç, çünkü sizin ve @ user12'nin bu yararlı yorumları kaybolacak.
Johannes Schaub -

İkilemi çözmek için bir uzlaşma olarak, cevabı topluluk wiki'si yaptım. Bu, hesabımdan aldığım tüm olumlu oy puanlarını ve olumsuz oy kaybını ortadan kaldırır. Kılık değiştirmiş zekice yorumum için bana hala teşekkür etmek isteyen varsa, bu temsili yorumu destekleyebilir.
Johannes Schaub -

10

@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.


5

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::vectorhepsini 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.


3
C ++ 'da hiçbir konteyner bu tür bir aritmetiğe sahip değildir, bu nedenle C ++' da vektörler yoktur. Özellikle a 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::vectorbir vektör olarak nitelendirilmez. Onu arardım dynamic_arrayya resizable_arrayda size ne olduğunu söyler.
user877329

4
Veya basitçe "liste". Ama noooooo ... "vektör" olmalıydı çünkü herkesin kullandığı şey bu, değil mi?
LearnCocos2D

1
@ LearnCocos2D, iyi, bir liste tipik olarak bağlantılı bir liste olarak anlaşılır. Aslında, C ++ standart kitaplığında liste adında bir kap zaten var - bu, çift bağlantılı bir listedir.
Andrej

3

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ı.


Matematikte "vektör" ün geldiği doğrusal cebirde, her şey işlemlerle ilgilidir ve tüm vektörler aynı boyuttadır. Doğrusal cebir, dolayısıyla işlemler , matematikte bir grup sayıyı bir vektör yapan şeydir.
E4z9

3

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.


bu bariz bir şekilde yanlıştır, bu bir vektör değildir en.wikipedia.org/wiki/Vector_space
sara

@kai Bu çatışmaları başka alanlarda da bulacaksınız. Bazı programlama dillerinde gerçek sayılar 0.1saklanamayacaktı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. "
Johannes Schaub -

Bir vektör Ne gelince ise , bu Tanımını kullanmak bağlıdır. Bu soru math.stackexchange.com yerine stackoverflow.com'da sorulduğu için , burada daha az matematik önyargılı bir yaklaşım savunacağım .
Johannes Schaub -

@kai Vektör uzaylarıyla ilgili olarak vektörün tanımına oldukça aşinayım. Bilgisayar bilimi tanımlarına da aşinayım, burada bir vektör sadece bellekte bitişik sayıların bir listesi, yani bir dizidir. Wikipedia'daki vektör için belirsizliği giderme sayfasında, 1D dizisi olmak için bir anlam gösterdiklerine dikkat edin. Bu, en azından 70'lerden beri var olan vektör işlemciler için kullanılan anlamla tam olarak aynıdır. Bu nedenle verdiğim tanım katı matematiksel tanım olmamakla birlikte daha eski de olsa bir bilgisayar bilimi tanımıdır.
James Matta

3

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ı.


2

Sanırım satır vektör teriminden geliyor . Ayrıca, bilgisayar bilimcileri bir şeyler için yeni isimler düşünmeyi severler ...


2

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.


kesinlikle matematiksel vektörler birçok boyutta ele alınır. Dinamik olmakla vektörün boyutunu değiştirdiğini kastediyorsanız, koordinatları ekleyerek veya keserek matematiksel "x boyutundaki bu vektörü düşünün" ifadesine kolayca karşılık gelebilir. Basit bir doğrusal dönüşüm, vektörleri n-dim uzaydan m-dim uzaydaki vektörlere eşleyebilir. Matematiksel vektörler ÇOK dinamiktir.
4pie

1

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.


1

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 nxmmatrisini A, burada nsatır sayısı ile aynıdır, ve msütun sayısı ile aynıdır. Matematiksel bir bağlamda, bunun gibi bir matrisi sunduğunuzda, daha sonra, Aaralığı dışında herhangi bir işlem yapamazsınız ve Aboyutunu da genişletemezsiniz . Bunun anlamı, bir [n + 1]ve / veya dizinine başvuramazsınız [m + 1].

Şimdi, Aboyutları 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.A1xm

Ö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.


0

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.


-2

vektörlerden oluşan matrisin yapısından gelir

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.