Mengapa vektor C ++ disebut Vector?


147

Pertanyaannya cukup jelas. Saya tahu sedikit tentang vektor dalam matematika, tetapi saya tidak benar-benar melihat tautan ke vektor C ++.


5
Vektor (arah + Magnitute) dalam fisika adalah hal pertama yang menyentuh pikiran saya saat saya mendengar kata vektor.
RBT

Jawaban:


109

Definisi matematika dari vektor adalah anggota himpunan Sn, yang merupakan urutan nilai yang diurutkan dalam set tertentu ( S). Inilah yang toko C ++ vector.


21
Vektor hanya biasanya dianggap 2-3 dimensi karena penggunaannya dalam fisika. Tetapi lebih umum dalam matematika, mereka hanya berarti satu set angka yang memiliki urutan (set matematika tidak teratur, mereka seperti tas yang diisi dengan barang-barang). Vektor dapat memiliki sejumlah elemen.
Joseph Garvin

8
vartec, tidak bisakah vektor Euclidean direpresentasikan sebagai vektor koordinat dan sebaliknya? Mereka hanya representasi berbeda dari hal yang sama (tuple) di ruang Euclidian versus ruang vektor yang lebih umum.
Calvin

6
@ Joseph Garvin: Vektor bahkan tidak perlu memiliki komponen yang berupa angka. Sebagai contoh, set fungsi tertentu dapat digunakan untuk membentuk ruang vektor di mana komponennya berfungsi.
jason

13
Vektor secara harfiah adalah "pembawa". Kata yang sama digunakan untuk (misalnya) serangga yang menularkan penyakit, dan berasal dari akar bahasa Latin yang sama dengan "kendaraan". Jadi itu adalah sesuatu yang membawa Anda dari satu tempat ke tempat lain. Kebetulan, kata "matriks" juga dari bahasa Latin, yang berarti "rahim".
Artelius

6
Ini tampaknya tidak memuaskan karena: 1. vektor Matematika tidak berubah dalam dimensi, 2. vektor Matematika memiliki operasi yang std::vectortidak menyediakan, 3. Argumen yang std::vectormerupakan memerintahkan urutan nilai-nilai bisa berlaku untuk std::list, std::deque, std::basic_string, dll
jamesdlin

190

Ini disebut vektor karena Alex Stepanov, perancang Perpustakaan Templat Standar, sedang mencari nama untuk membedakannya dari array bawaan. Dia mengakui sekarang bahwa dia membuat kesalahan, karena matematika sudah menggunakan istilah 'vektor' untuk urutan angka dengan panjang tetap. C ++ 11 menambah kesalahan ini dengan memperkenalkan kelas 'array' yang berperilaku mirip dengan vektor matematika.

Pelajaran Alex: berhati-hatilah setiap kali Anda menyebutkan sesuatu.


1
Tetapi array juga tidak akan menggunakan alokasi heap yang membuatnya bergerak kurang efisien. Kami juga memiliki std :: valarray, btw.
sellibitze

1
Anda dapat mengalokasikannya di heap adalah langkah murah yang diinginkan.

2
Senang mengetahui bahwa mereka mempelajari pelajaran itu meskipun sudah terlambat. Meskipun ... typedef atau #define dapat memperbaikinya juga.
LearnCocos2D

4
Hanya ada dua hal yang sulit dalam Ilmu Komputer: pembatalan cache dan penamaan hal - Phil Karlton
RBT

7
jika Anda akan mengklaim "[Alex Stepanov] mengakui sekarang bahwa ia melakukan kesalahan" dalam jawaban Anda, maukah Anda memberikan kutipan?
Trevor Boyd Smith

56

Kutipan dari Bahasa Pemrograman C ++ oleh Bjarne Stroustrup:

"Orang bisa berpendapat bahwa valarray seharusnya disebut vektor karena itu adalah vektor matematika tradisional dan vektor itu seharusnya disebut array . Namun, ini bukan cara terminologi berkembang."


51
Pfftt .. apa yang orang itu ketahui. Saya bahkan belum pernah mendengar orang "Bjarne Stroustrup" ini.
Calvin

5
Saya hanya ingin tahu berapa banyak upvotes dari komentar sebelumnya sebenarnya adalah hasil dari underflow ...
rindeal

16

Namanya berasal dari aljabar linier, di mana vektor adalah matriks dengan hanya satu kolom atau hanya satu baris.


10

Hanya untuk mengatakan mengapa itu mungkin tidak disebut array: Karena std::vectormemiliki ukuran yang dinamis. Array secara konseptual memiliki panjang yang tetap. Selanjutnya C ++ Standard memiliki std::arraytemplate, yang ukurannya tetap dan harus lebih disukai daripada array biasa:

std::array<int, 4> f = { 1, 2, 3, 4 };

Apakah standar C ++ baru sudah dirilis?
Johannes Jensen

1
ini bukan jawaban, karena vektor juga memiliki ukuran tetap. vektor adalah nilai murni, mereka adalah elemen dalam himpunan yang bersama-sama dengan beberapa struktur tambahan membentuk ruang vektor abstrak. gagasan "mengubah ukuran" vektor adalah omong kosong.
sara

@ai saya pikir ada kebingungan di sini. Saya hanya berdebat mengapa tidak disebut array . Saya belum mencoba untuk menjelaskan mengapa hal itu secara khusus disebut vektor . Array dalam C ++ bahkan sebelum standardisasi bahasa selalu memiliki ukuran tetap, jadi penamaan kelas yang resizable std::arraytidak akan baik.
Johannes Schaub - litb

sekarang Anda dapat dengan benar mengeluh bahwa ini bukan jawaban, tetapi komentar yang valid. Sejauh saya setuju dengan setengah kalimat pertama (hingga koma) dari komentar Anda. Namun, sekarang sudah terlambat untuk memindahkan jawaban saya menjadi komentar pada pertanyaan, karena komentar Anda dan @ user12 yang bermanfaat ini akan hilang.
Johannes Schaub - litb

Sebagai kompromi untuk menyelesaikan dilema, saya telah membuat komunitas jawaban wiki. Ini menghilangkan semua poin upvote dan downvote kerugian yang saya dapatkan dari akun saya. Jika ada yang masih ingin mengucapkan terima kasih atas komentar cerdik saya, mereka dapat mengangkat komentar representasional ini.
Johannes Schaub - litb

10

Untuk melengkapi tanggapan istimewa dari @MarkRuzon:

Alex mengatakan bahwa untuk memberi nama pada apa yang sekarang disebut std :: vector, ia mengamati nama yang diberikan Skema dan Common Lisp kepada struktur data yang serupa.

Kemudian dia mengakui bahwa dia salah karena vektor C ++ tidak ada hubungannya dengan vektor dalam matematika.

Dia juga mengatakan bahwa dia memperkenalkan kesalahan komunitas 50 orang ke komunitas 5 juta orang, jadi kesalahan itu kemungkinan akan tetap selamanya.


5

Itu hanya namanya saja. Vektor C ++ bisa sangat baik (atau mungkin bahkan lebih akurat) disebut array dinamis atau array resizable tetapi nama ini hanya dipilih . Ini vektor adalah tidak sama dengan vektor dari methematics karena dalam matematika vektor adalah anggota setiap himpunan V sehingga ada dua penting operasi didefinisikan pada himpunan ini: + (penambahan vektor) dan x (perkalian vektor dengan skalar dari lapangan F ) dan operasi ini memenuhi 8 aksioma :


Asosiatif penambahan

u + (v + w) = (u + v) + w

Commutativity penambahan

u + v = v + u

Elemen identitas penambahan

Ada ada unsur 0 ∈ V , yang disebut vektor nol , sehingga v + 0 = v untuk semua v ∈ V .

Elemen tambahan dari inverse

Untuk setiap v ∈ V, terdapat elemen −v ∈ V , disebut aditif invers dari v, sehingga v + (−v) = 0

Kompatibilitas multiplikasi skalar dengan multiplikasi bidang

a (bv) = (ab) v

Elemen identitas multiplikasi skalar

1 v = v, di mana 1 menunjukkan identitas perkalian di F .

Distribusi dari multiplikasi skalar sehubungan dengan penambahan vektor  

a (u + v) = au + av

Distribusi dari multiplikasi skalar sehubungan dengan penambahan lapangan

(a + b) v = av + bv


C ++ std::vectormendukung semuanya (tidak secara langsung, tetapi melalui fitur C ++), sehingga entah bagaimana bisa disebut vektor, tetapi itu hanya bahasa sehari-hari dan misalnya Vallarayditunjukkan oleh Bjarne Stroustrup di "C ++ Programming Language" yang mendukung sebagian dari mereka secara langsung.


3
Tidak ada wadah di C ++ yang memiliki jenis aritmatika yang ditentukan sehingga tidak ada vektor dalam C ++. Khususnya a std::vectortidak mendukung operasi aritmatika, dan oleh karena itu, semua properti ini tidak terdefinisi untuk a std::vector. Jadi a std::vectortidak memenuhi syarat sebagai vektor. Saya akan menyebutnya dynamic_arrayatau resizable_arrayyang memberi tahu Anda apa itu.
user877329

4
Atau cukup "daftar". Tapi tidaaaak ... itu pasti "vektor" karena itulah yang digunakan semua orang , bukan?
LearnCocos2D

1
@ LearnCocos2D, daftar biasanya dipahami sebagai daftar tertaut. Bahkan, sudah ada wadah yang disebut daftar di pustaka standar C ++ - ini adalah daftar yang ditautkan dua kali lipat.
Andrej

3

Vektor hanyalah urutan nilai, semua dari jenis yang sama. Ini cukup banyak sejalan dengan penggunaan dalam matematika. Saya kira ide matematika bahwa vektor harus mendukung beberapa operasi umum (seperti menambahkan, dan penskalaan dengan skalar) tidak terbawa, aspek penting terutama struktur.


Dalam aljabar linier, di mana "vektor" berasal dari matematika, semuanya tentang operasi, dengan semua vektor berukuran sama. Aljabar linier, jadi operasinya , adalah yang membuat banyak angka sebagai vektor dalam matematika.
E4z9

3

Juga jika Anda membuatnya menyimpan bilangan bulat atau titik apung itu membuat jenis yang sangat baik untuk menyimpan vektor dimensi N. Setelah semua vektor, adalah daftar angka yang disimpan dalam urutan tertentu.


ini benar-benar salah, bukan itu vektornya en.wikipedia.org/wiki/Vector_space
sara

@ Kai Anda juga akan menemukan konflik ini di area lain. Bilangan real dalam beberapa bahasa pemrograman tidak akan dapat menyimpan 0.1, jika dalam matematika, nilai ini adalah anggota dari himpunan bilangan real. Dalam bahasa pemrograman Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) vektor adalah "Kelas vektor mengimplementasikan array objek yang dapat ditumbuhkan. Seperti sebuah array, ia berisi komponen yang dapat diakses menggunakan indeks integer. Namun, ukuran Vektor dapat tumbuh atau menyusut sesuai kebutuhan untuk mengakomodasi penambahan dan penghapusan item setelah Vector dibuat. "
Johannes Schaub - litb

Adapun apa vektor itu , itu tergantung pada definisi yang Anda gunakan. Karena pertanyaan ini ditanyakan pada stackoverflow.com , bukan pada math.stackexchange.com , saya akan berdebat untuk pendekatan yang kurang bias matematika di sini.
Johannes Schaub - litb

@ Kai Saya cukup akrab dengan definisi vektor dalam hal ruang vektor. Saya juga akrab dengan definisi ilmu komputer, di mana vektor hanyalah daftar angka yang berdekatan dalam memori, yaitu array. Perhatikan bahwa pada halaman disambiguasi untuk vektor di wikipedia bahwa mereka menunjukkan satu makna menjadi array 1D. Ini persis sama dengan makna yang digunakan untuk prosesor vektor, yang telah ada sejak setidaknya 70-an. Oleh karena itu, walaupun definisi yang saya berikan bukan definisi matematika yang ketat, itu adalah definisi ilmu komputer, meskipun lebih tua.
James Matta

3

Dulu, dalam bahasa B ada jenis vektor. Kemudian bahasa C memanggil mereka "array". Kemudian bahasa C dengan Kelas dan bahasa C ++ baru saja membuatnya ...

Ini tentu saja bukan keseluruhan cerita. Seperti disebutkan di atas, Stepanov membuat keputusan yang sebenarnya. Tetapi jika "vektor" masih digunakan dalam C, hasilnya mungkin terlihat sangat berbeda.

PS. Saya bertanya-tanya mengapa C mengganti nama "array". Apa alasan tepatnya?

PS2. IMO untuk bahasa sebagai C ++, array lebih baik yang berarti "elemen tipe penahanan untuk diakses secara wajar melalui operator []" (mis. Bukan 42 [some_array_object]), misalnya instantiasi std :: map sebagai "array asosiatif".


2

Saya kira itu berasal dari vektor baris istilah . Juga, para ilmuwan komputer suka memikirkan nama-nama baru untuk hal-hal ...


2

tetapi vektor matematika tidak dinamis, saya belum pernah melihat satu perubahan dari 2D ke 3D atau apa pun, jika sesuatu array tradisional membuat vektor lebih baik.


Pastikan vektor matematika dipertimbangkan dalam banyak dimensi. Jika dengan menjadi dinamis Anda maksudkan bahwa vektor mengubah ukurannya maka ia dapat dengan mudah sesuai dengan matematika "pertimbangkan vektor ini dalam dimensi x" dengan menambahkan atau memotong koordinat. Transformasi linear sederhana dapat memetakan vektor dari ruang n-redup ke vektor dalam ruang m-redup. Vektor matematika sangat dinamis.
4pie0

1

Tidak tahu tentang alasan sebenarnya, tetapi C ++ menyebutnya vektor bukan array, mengurangi kebingungan antara struktur C dan C ++, meskipun mereka memenuhi peran yang sama.


1

Pikirkan vektor C ++ sebagai array dinamis, yang ukurannya dapat diubah dengan memasukkan atau menghapus elemen. Mereka tidak terkait dengan definisi matematika vektor.

Vektor dalam Matematika

Pertimbangkan nxmmatriks yang disebut A, di mana nsesuai dengan jumlah baris, dan msesuai dengan jumlah kolom. Dalam konteks matematika, setelah Anda memperkenalkan matriks seperti ini, maka nanti, Anda tidak dapat melakukan operasi apa pun di luar Ajangkauan dan Anda juga tidak dapat memperluas Aukuran. Artinya, Anda tidak dapat merujuk ke indeks [n + 1]dan / atau [m + 1].

Sekarang, vektor yang Amenurunkan atribut-atribut ini juga, sementara dimensinya akan selalu 1xm(setiap [i]baris yang dipilih di dalam A) atau nx1(setiap [j]kolom yang dipilih dalam A). Vektor juga tidak dapat ditentukan sebagai 2xn, karena kumpulan vektor tidak dapat diartikan sebagai satu vektor, sedangkan satu vektor - biarkan itu menjadi [i]vektor kolom Adengan dimensi 1xm- dapat diartikan sebagai matriks.

Yang penting adalah Anda tidak bisa mengubah dimensi vektor begitu itu diperkenalkan dalam hal matematika.

Vektor dalam C ++

Dalam C ++, vektor sama seperti vektor dalam matematika, tetapi tidak seperti dalam matematika ukurannya dapat diubah . Ukuran sebagai istilah berlaku di sini karena menyiratkan jumlah elemen yang mengandung satu vektor tertentu.

Anda menggunakan dimensi jangka segi C ++ vektor, ketika Anda memiliki vektor vektor: std::vector<std::vector<T>>> ragged_array. Dalam contoh ini, saya menyebut vektor itu "kasar", karena ini menunjukkan bagaimana ukuran setiap vektor dari vektor itu dapat diubah secara independen. Ini tidak hanya melanggar aturan tentang bagaimana dimensi tidak dapat diubah begitu vektor tertentu diperkenalkan dalam matematika, tetapi juga menunjukkan, bagaimana dimensi itu tidak dapat digunakan sebagai matriks.


0

Ingin tahu bahwa parametrisation pada jenis tidak untuk nama ..

di sini kolom diledakkan .. (lihat sumber untuk beberapa keterampilan penyandian ASP.NET HTML sisi-server)

atau apakah itu berturut-turut?

Kemudian lagi, memikirkannya dalam konteks mesin MIMD atau bahkan SSE vektor, namanya masih terdengar sangat bagus.


-2

itu berasal dari struktur matriks yang dibangun dari vektor

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.