เหตุใด C ++ เวกเตอร์จึงเรียกว่าเวกเตอร์


147

คำถามนี้อธิบายได้ด้วยตัวเองจริงๆ ฉันรู้รางเกี่ยวกับเวกเตอร์ในคณิตศาสตร์ แต่ฉันไม่เห็นลิงก์ไปยังเวกเตอร์ C ++


5
เวกเตอร์ (ทิศทาง Magnitute +) ในวิชาฟิสิกส์เป็นสิ่งแรกที่กระทบใจของฉันในขณะที่ฉันได้ยินคำว่าเวกเตอร์
RBT

คำตอบ:


109

นิยามทางคณิตศาสตร์ของเวกเตอร์เป็นสมาชิกของเซตSnซึ่งเป็นลำดับของค่าในชุดเฉพาะ ( S) นี่คือสิ่งที่vectorร้านค้าC ++


21
โดยทั่วไปเวกเตอร์จะพิจารณาเพียง 2-3 มิติเท่านั้นเนื่องจากใช้ในฟิสิกส์ แต่โดยทั่วไปในวิชาคณิตศาสตร์พวกเขาหมายถึงชุดของตัวเลขที่มีคำสั่ง (ชุดคณิตศาสตร์ไม่มีระเบียบพวกมันเหมือนกระเป๋าที่เต็มไปด้วยสิ่งของ) เวกเตอร์สามารถมีองค์ประกอบจำนวนเท่าใดก็ได้
Joseph Garvin

8
vartec, เวกเตอร์ Euclidean ไม่สามารถแสดงเป็นเวกเตอร์พิกัดและในทางกลับกันได้หรือไม่? พวกมันเป็นเพียงการนำเสนอที่แตกต่างกันของสิ่งเดียวกัน (ทูเปิล) ในปริภูมิแบบยุคลิดเมื่อเทียบกับปริภูมิเวกเตอร์ทั่วไปที่มากกว่า
Calvin

6
@Joseph Garvin: เวกเตอร์ไม่จำเป็นต้องมีส่วนประกอบที่เป็นตัวเลข ตัวอย่างเช่นชุดของฟังก์ชั่นบางอย่างสามารถใช้ในการสร้างช่องว่างแบบเวกเตอร์ที่ส่วนประกอบเป็นฟังก์ชั่น
jason

13
เวกเตอร์เป็น "ผู้ให้บริการ" อย่างแท้จริง คำเดียวกันนี้ใช้สำหรับ (เช่น) แมลงที่ส่งโรคและมาจากรากละตินเดียวกันกับ "ยานพาหนะ" ดังนั้นจึงเป็นสิ่งที่จะพาคุณจากที่หนึ่งไปอีกที่หนึ่ง อนึ่งคำว่า "เมทริกซ์" นั้นมาจากภาษาละตินซึ่งแปลว่า "มดลูก"
Artelius

6
เหล่านี้ดูเหมือนว่าไม่น่าพอใจเพราะ 1. เวกเตอร์คณิตศาสตร์ไม่เปลี่ยนแปลงในมิติ 2. เวกเตอร์คณิตศาสตร์มีการดำเนินงานที่std::vectorไม่ได้ให้ 3. การโต้แย้งที่std::vectorเป็นลำดับของค่าสามารถนำไปใช้std::list, std::deque, std::basic_stringฯลฯ
jamesdlin

189

มันเรียกว่าเวกเตอร์เพราะ Alex Stepanov ผู้ออกแบบไลบรารีแม่แบบมาตรฐานกำลังมองหาชื่อที่จะแยกแยะมันออกจากอาร์เรย์ในตัว ตอนนี้เขายอมรับว่าเขาทำผิดเพราะคณิตศาสตร์ใช้คำว่า 'เวกเตอร์' สำหรับลำดับตัวเลขที่มีความยาวคงที่แล้ว C ++ 11 แก้ไขข้อผิดพลาดนี้โดยการแนะนำ 'อาเรย์' ของคลาสที่มีพฤติกรรมคล้ายกับเวกเตอร์ทางคณิตศาสตร์

บทเรียนของ Alex โปรดระวังทุกครั้งที่คุณตั้งชื่อบางอย่าง


1
แต่อาร์เรย์จะไม่ใช้การจัดสรรฮีปซึ่งทำให้การย้ายมีประสิทธิภาพน้อยลง นอกจากนี้เรายังมีมาตรฐาน :: valarray, btw
sellibitze

1
คุณสามารถจัดสรรมันได้ในกองที่ต้องการย้ายที่ถูก

2
ดีใจที่ได้รู้ว่าพวกเขาเรียนรู้บทเรียนนั้นแม้ว่าจะสายเกินไป แม้ว่า ... typedef หรือ #define สามารถแก้ไขได้เช่นกัน
LearnCocos2D

4
มีเพียงสองสิ่งที่ยากในวิทยาศาสตร์คอมพิวเตอร์: การทำให้ใช้ไม่ได้แคชและการตั้งชื่อ - Phil Karlton
RBT

7
หากคุณกำลังจะอ้างสิทธิ์ "[Alex Stepanov] ยอมรับว่าเขาทำผิดพลาด" ในคำตอบของคุณคุณจะช่วยอ้างอิงได้ไหม?
Trevor Boyd Smith

56

ข้อความที่ตัดตอนมาจากภาษาการเขียนโปรแกรม C ++โดย Bjarne Stroustrup:

"ใคร ๆ ก็อาจโต้แย้งได้ว่าวาลาเรย์ ควรจะถูกเรียกว่าเวกเตอร์ เพราะมันเป็นเวกเตอร์คณิตศาสตร์แบบดั้งเดิมและเวกเตอร์ นั้นควรถูกเรียกว่าอาเรย์อย่างไรก็ตามนี่ไม่ใช่วิธีที่วิวัฒนาการของคำศัพท์"


51
Pfftt .. หมอนั่นรู้อะไร ฉันไม่เคยได้ยินแม้แต่คนนี้ "Bjarne Stroustrup"
344 Calvin

5
ฉันแค่สงสัยว่าจำนวน upvotes ของความคิดเห็นก่อนหน้านี้เป็นจริงเป็นผลมาจาก underflow ...
rindeal

16

ชื่อมาจากพีชคณิตเชิงเส้นโดยที่เวกเตอร์เป็นเมทริกซ์ที่มีเพียงหนึ่งคอลัมน์หรือเพียงหนึ่งแถว


10

เพียงเพื่อบอกว่าทำไมจึงไม่อาจเรียกได้ว่าarray: เพราะstd::vectorมีขนาดแบบไดนามิก อาร์เรย์แนวคิดถูกกำหนดความยาว มาตรฐาน C ++ ถัดไปโดยวิธีมีstd::arrayแม่แบบซึ่งได้รับการแก้ไขในขนาดและควรจะต้องมากกว่าอาร์เรย์ธรรมดา:

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

มีการปล่อยมาตรฐาน C ++ ใหม่หรือยัง
โยฮันเนสเซ่น

1
นี่ไม่ใช่คำตอบที่มากนักเนื่องจากเวกเตอร์มีขนาดคงที่เช่นกัน เวกเตอร์เป็นค่าบริสุทธิ์พวกมันเป็นองค์ประกอบในเซตที่พร้อมกับโครงสร้างเพิ่มเติมบางอย่างในรูปแบบพื้นที่เวกเตอร์นามธรรม แนวคิดของ "การเปลี่ยนขนาด" ของเวกเตอร์นั้นไร้สาระสมบูรณ์
ร่า

@ ไก่ฉันคิดว่ามีความสับสนที่นี่ ฉันแค่แย้งว่าทำไมมันไม่เรียกว่าอาเรย์ ฉันไม่ได้พยายามที่จะอธิบายว่าทำไมมันโดยเฉพาะที่เรียกว่าเวกเตอร์ อาร์เรย์ใน C ++ ก่อนที่มาตรฐานของภาษาจะมีขนาดคงที่เสมอดังนั้นการตั้งชื่อคลาสที่ปรับขนาดได้std::arrayจะไม่ดี
Johannes Schaub - litb

ตอนนี้คุณสามารถบ่นได้อย่างถูกต้องว่านี่ไม่ใช่คำตอบที่มากนัก แต่เป็นความคิดเห็นที่ถูกต้อง ตราบเท่าที่ฉันเห็นด้วยกับครึ่งประโยคแรก (ถึงเครื่องหมายจุลภาค) ของความคิดเห็นของคุณ อย่างไรก็ตามตอนนี้มันสายเกินไปที่จะย้ายคำตอบของฉันลงในความคิดเห็นเกี่ยวกับคำถามเนื่องจากความคิดเห็นที่มีประโยชน์เหล่านี้ของคุณและ @ user12 จะหายไป
Johannes Schaub - litb

เพื่อประนีประนอมในการแก้ปัญหาฉันได้ทำคำตอบวิกิชุมชน สิ่งนี้จะลบคะแนน upvote ทั้งหมดและการสูญเสีย downvote ที่ฉันได้รับจากบัญชีของฉัน หากใครยังคงต้องการที่จะขอบคุณฉันสำหรับการแสดงความคิดเห็นแยบยลของฉันพวกเขาสามารถโหวตความคิดเห็นที่เป็นตัวแทนนี้
Johannes Schaub - litb

10

เพื่อเสริมการตอบสนองที่ยอดเยี่ยมจาก @MarkRuzon:

อเล็กซ์กล่าวว่าเพื่อให้ชื่อกับสิ่งที่เรียกว่า std :: vector เขาสังเกตเห็นชื่อที่SchemeและCommon LISPให้กับโครงสร้างข้อมูลที่คล้ายกัน

ต่อมาเขายอมรับว่าเขาผิดเพราะเวกเตอร์C ++ไม่มีส่วนเกี่ยวข้องกับเวกเตอร์ในวิชาคณิตศาสตร์

นอกจากนี้เขายังกล่าวว่าเขาแนะนำข้อผิดพลาดของชุมชน 50 คนในชุมชน 5 ล้านคนดังนั้นข้อผิดพลาดน่าจะยังคงอยู่ตลอดไป


5

มันเป็นเพียงชื่อ c ++ เวกเตอร์ได้เป็นอย่างดี (หรือแม้กระทั่งถูกต้องมากขึ้น) จะเรียกว่าอาร์เรย์แบบไดนามิกหรืออาร์เรย์ปรับขนาดได้แต่ชื่อนี้เป็นเพียงการได้รับการแต่งตั้ง นี้เวกเตอร์ไม่ได้เป็นเช่นเดียวกับเวกเตอร์จาก methematics เพราะในวิชาคณิตศาสตร์เวกเตอร์เป็นสมาชิกของใด ๆ ชุดVดังกล่าวว่ามีสองสิ่งที่สำคัญการดำเนินงานที่กำหนดไว้ในชุดนี้: + (นอกจากของเวกเตอร์) และx (คูณของเวกเตอร์โดยเกลาจากฟิลด์F ) และการดำเนินการเหล่านี้เป็นไปตามหลักการ 8 ประการ :


ความเกี่ยวข้องของการเพิ่ม

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

การเปลี่ยนของการเติม

u + v = v + u

องค์ประกอบประจำตัวของการเพิ่ม

มีองค์ประกอบที่มีอยู่ 0 ∈ Vเรียกว่าเวกเตอร์ศูนย์เช่นว่า V + 0 = V สำหรับทุกวี∈ V

องค์ประกอบผกผันของการเพิ่ม

สำหรับ v ∈ V ทุกครั้งจะมีองค์ประกอบ −v ∈ V ที่เรียกว่าการเพิ่มค่าผกผันของ v เช่นนั้น v + (−v) = 0

ความเข้ากันได้ของการคูณสเกลาร์กับการคูณฟิลด์

a (bv) = (ab) v

องค์ประกอบตัวตนของการคูณสเกลาร์

1 v = V ที่1หมายถึงตัวตนคูณในF

การกระจายตัวของการคูณสเกลาร์เทียบกับการเพิ่มเวกเตอร์  

a (u + v) = au + av

การกระจายตัวของการคูณสเกลาร์เมื่อเทียบกับการเพิ่มสนาม

(a + b) v = av + bv


C ++ std::vectorสนับสนุนทั้งหมดของพวกเขา (ไม่ใช่โดยตรง แต่ผ่านคุณสมบัติ C ++) ดังนั้นมันจึงสามารถเรียกได้ว่าเวกเตอร์ แต่มันก็เป็นแค่ภาษาพูดและตัวอย่างเช่นVallarayBjarne Stroustrup ใน"ภาษาโปรแกรม C ++"สนับสนุนบางส่วนโดยตรง


3
ไม่มีคอนเทนเนอร์ใน C ++ ที่มีการคำนวณทางคณิตศาสตร์ชนิดนั้นจึงไม่มีพาหะใน C ++ ในโดยเฉพาะอย่างยิ่งไม่สนับสนุนการดำเนินการทางคณิตศาสตร์และดังนั้นจึงทั้งหมดของคุณสมบัติเหล่านี้จะไม่ได้กำหนดให้std::vector std::vectorดังนั้น a จึงstd::vectorไม่มีคุณสมบัติเป็นเวกเตอร์ ฉันจะได้เรียกมันdynamic_arrayหรือresizable_arrayที่จะบอกคุณว่ามันคืออะไร
user877329

4
หรือเพียงแค่ "รายการ" แต่ noooooo ... มันต้องเป็น "เวกเตอร์" เพราะนั่นคือสิ่งที่ทุกคนใช้ใช่ไหม
LearnCocos2D

1
@ LearnCocos2D เอาล่ะรายการมักจะเข้าใจว่าเป็นรายการที่เชื่อมโยง ในความเป็นจริงมีคอนเทนเนอร์ที่เรียกว่ารายการในไลบรารีมาตรฐาน C ++ ซึ่งเป็นรายการที่เชื่อมโยงเป็นสองเท่า
Andrej

3

เวกเตอร์เป็นเพียงลำดับของค่าทุกประเภทเดียวกัน มันค่อนข้างสอดคล้องกับการใช้งานทางคณิตศาสตร์มาก ฉันเดาว่าความคิดทางคณิตศาสตร์ที่เวกเตอร์ควรสนับสนุนการดำเนินการทั่วไปบางอย่าง (เช่นการเพิ่มและการขยายด้วยสเกลาร์) ไม่ได้ถูกนำมาใช้สิ่งสำคัญคือโครงสร้าง


ในพีชคณิตเชิงเส้นที่ "เวกเตอร์" มาจากคณิตศาสตร์ทุกอย่างเกี่ยวกับการดำเนินการโดยเวกเตอร์ทั้งหมดมีขนาดเท่ากัน พีชคณิตเชิงเส้นดังนั้นการดำเนินการคือสิ่งที่ทำให้จำนวนเวกเตอร์ในคณิตศาสตร์
E4z9

3

นอกจากนี้หากคุณทำให้มันเก็บจำนวนเต็มหรือจุดลอยตัวมันจะทำให้เป็นประเภทที่ยอดเยี่ยมสำหรับการจัดเก็บเวกเตอร์มิติ N ท้ายสุดเวกเตอร์ทั้งหมดคือรายการหมายเลขที่เก็บไว้ในลำดับเฉพาะ


นี่เป็นเท็จโจ๋งครึ่มนั่นไม่ใช่สิ่งที่เวกเตอร์เป็นen.wikipedia.org/wiki/Vector_space
sara

@kai คุณจะพบความขัดแย้งเหล่านี้ในพื้นที่อื่น ๆ เช่นกัน จำนวนจริงในภาษาการเขียนโปรแกรมบางอย่างจะไม่สามารถจัดเก็บได้0.1ในทางคณิตศาสตร์ค่านี้เป็นสมาชิกของชุดจำนวนจริง ในภาษาการเขียนโปรแกรม Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) เวกเตอร์คือ "คลาส Vector ใช้อาร์เรย์ของวัตถุที่เติบโตได้เช่นเดียวกับอาร์เรย์มันมีส่วนประกอบที่ สามารถเข้าถึงได้โดยใช้ดัชนีจำนวนเต็มอย่างไรก็ตามขนาดของ Vector สามารถเพิ่มหรือลดขนาดได้ตามต้องการเพื่อรองรับการเพิ่มและลบรายการหลังจากสร้าง Vector แล้ว "
Johannes Schaub - litb

เป็นสิ่งที่เวกเตอร์คือมันขึ้นอยู่กับที่มีความหมายที่คุณใช้ ตามที่คำถามนี้ถูกถามในstackoverflow.comแทนที่จะเป็นmath.stackexchange.comฉันจะโต้แย้งว่ามีวิธีการคำนวณทางคณิตศาสตร์น้อยลงที่นี่
Johannes Schaub - litb

@ ไก่ฉันค่อนข้างคุ้นเคยกับคำจำกัดความของเวกเตอร์เกี่ยวกับการเว้นวรรคเวกเตอร์ ฉันยังคุ้นเคยกับคำจำกัดความของวิทยาการคอมพิวเตอร์โดยที่เวกเตอร์เป็นเพียงรายการของจำนวนที่อยู่ติดกันในหน่วยความจำเช่นอาร์เรย์ โปรดสังเกตว่าในหน้าแก้ความกำกวมสำหรับเวกเตอร์ในวิกิพีเดียพวกเขาแสดงความหมายหนึ่งว่าเป็นอาร์เรย์ 1D นี่เป็นความหมายเดียวกับที่ใช้สำหรับโปรเซสเซอร์เวกเตอร์ซึ่งมีมาตั้งแต่ยุค 70 เป็นอย่างน้อย ดังนั้นในขณะที่คำจำกัดความที่ฉันให้ไม่ใช่คำจำกัดความทางคณิตศาสตร์ที่เข้มงวด แต่มันเป็นนิยามด้านวิทยาศาสตร์คอมพิวเตอร์
James Matta

3

นานมาแล้วในภาษา Bมีประเภทเวกเตอร์ จากนั้นภาษา C เรียกว่า "อาร์เรย์" จากนั้น C ที่มีคลาสและภาษา C ++ เพิ่งได้รับ ...

นี่ไม่ใช่เรื่องราวทั้งหมดอย่างแน่นอน ดังที่ได้กล่าวมาแล้ว Stepanov ได้ทำการตัดสินใจจริง แต่ถ้า "vector" ยังคงถูกใช้ใน C ผลลัพธ์อาจจะดูแตกต่างออกไป

PS ฉันสงสัยว่าทำไม C เปลี่ยนชื่อเป็น "อาร์เรย์" อะไรคือเหตุผลที่แน่นอน

PS2 IMO สำหรับภาษา C + +, อาเรย์เป็นความหมายที่ดีกว่า "ประเภทการเก็บองค์ประกอบที่จะเข้าถึงได้อย่างสมเหตุสมผลผ่านโอเปอเรเตอร์ []" (เช่นไม่ใช่ 42 [some_array_object]) เช่นการสร้างอินสแตนซ์ของ std :: map ในฐานะ


2

ฉันคิดว่ามันมาจากคำเวกเตอร์แถว นอกจากนี้นักวิทยาศาสตร์คอมพิวเตอร์ชอบคิดชื่อใหม่สำหรับสิ่งต่าง ๆ ...


2

แต่เวกเตอร์เชิงคณิตศาสตร์ไม่ใช่แบบไดนามิกฉันไม่เคยเห็นการเปลี่ยนแปลงอย่างใดอย่างหนึ่งจาก 2D เป็น 3D หรืออย่างอื่นถ้าอาร์เรย์แบบดั้งเดิมใดที่ทำให้เวกเตอร์ดีขึ้น


แน่นอนว่าเวกเตอร์ทางคณิตศาสตร์นั้นมีหลายมิติ ถ้าคุณเป็นพลวัตคุณหมายความว่าเวกเตอร์เปลี่ยนขนาดมันก็อาจจะสอดคล้องกับคณิตศาสตร์ได้ง่าย ๆ "พิจารณาเวกเตอร์นี้ในมิติ x" โดยการเพิ่มหรือตัดทอนพิกัด การแปลงเชิงเส้นอย่างง่ายอาจแมพเวกเตอร์จากพื้นที่ n-dim เป็นเวกเตอร์ในพื้นที่ m-dim เวกเตอร์ทางคณิตศาสตร์เป็นแบบไดนามิกมาก
4pie0

1

ไม่มีความคิดเกี่ยวกับเหตุผลที่แท้จริง แต่ C ++ เรียกมันว่าเวกเตอร์แทนอาร์เรย์ช่วยลดความสับสนระหว่างโครงสร้าง C และ C ++ แม้ว่าพวกเขาจะทำหน้าที่เดียวกัน


1

คิดว่าเวกเตอร์ C ++ เป็นอาร์เรย์แบบไดนามิกซึ่งขนาดสามารถเปลี่ยนแปลงได้โดยการแทรกหรือลบองค์ประกอบ พวกมันไม่เกี่ยวข้องกับนิยามทางคณิตศาสตร์ของเวกเตอร์

เวกเตอร์ในวิชาคณิตศาสตร์

พิจารณาnxmเมทริกซ์ที่เรียกว่าAซึ่งnสอดคล้องกับจำนวนแถวและmสอดคล้องกับจำนวนคอลัมน์ ในบริบททางคณิตศาสตร์เมื่อคุณแนะนำเมทริกซ์เช่นนี้จากนั้นคุณจะไม่สามารถดำเนินการใด ๆ นอกAช่วงที่กำหนดและคุณไม่สามารถขยายAขนาดได้เช่นกัน สิ่งที่หมายถึงนี้ก็คือคุณไม่สามารถอ้างถึงดัชนีของและ[n + 1] / หรือ[m + 1]

ทีนี้เวกเตอร์ที่ได้Aมาจะมีคุณสมบัติเหล่านี้เช่นกันในขณะที่ขนาดของมันจะเป็น1xm( [i]แถวใดก็ได้ที่เลือกภายในA) หรือnx1( [j]คอลัมน์ใด ๆ ที่เลือกภายในA) เวกเตอร์ไม่สามารถระบุได้เช่น2xnกันเนื่องจากชุดของเวกเตอร์ไม่สามารถตีความได้ว่าเป็นหนึ่งเวกเตอร์ในขณะที่เวกเตอร์หนึ่ง - ให้นั่นคือ[i]เวกเตอร์คอลัมน์ของที่Aมีขนาดของ1xm- สามารถตีความได้ว่าเป็นเมทริกซ์

สิ่งที่สำคัญคือคุณไม่สามารถเปลี่ยนขนาดของเวกเตอร์ได้เมื่อมันถูกนำมาใช้ในเชิงคณิตศาสตร์

เวกเตอร์ใน C ++

ใน C ++ เวกเตอร์ก็เหมือนกับเวกเตอร์ในคณิตศาสตร์ แต่ไม่เหมือนกับคณิตศาสตร์ที่ขนาดของมันสามารถเปลี่ยนแปลงได้ ขนาดเป็นคำที่ใช้ที่นี่เพราะมันหมายถึงองค์ประกอบที่เวกเตอร์หนึ่งมี

คุณสามารถใช้มิติระยะในแง่ของภาษา C ++ std::vector<std::vector<T>>> ragged_arrayเวกเตอร์เมื่อคุณมีเวกเตอร์ของเวกเตอร์: ในตัวอย่างนี้ฉันเรียกเวกเตอร์นั้นว่า "ragged" เพราะมันแสดงให้เห็นว่าขนาดของแต่ละเวกเตอร์ของเวกเตอร์นั้นสามารถเปลี่ยนแปลงได้อย่างอิสระ ไม่เพียง แต่ละเมิดกฎว่ามิติไม่สามารถเปลี่ยนแปลงได้เมื่อมีการแนะนำเวกเตอร์เฉพาะในคณิตศาสตร์ แต่ยังแสดงให้เห็นว่ามันไม่สามารถใช้เป็นเมทริกซ์ได้


0

สิ่งมหัศจรรย์ที่การตั้งชื่อพารามิเตอร์ให้กับชื่อมีดังนี้ ..

ที่นี่คอลัมน์จะถูกทำลาย .. (ดูแหล่งที่มาสำหรับทักษะการเข้ารหัส HTML ฝั่งเซิร์ฟเวอร์)

หรือว่าเป็นแถว?

จากนั้นอีกครั้งให้คิดถึงมันใน MIMD หรือบริบทของเครื่องเวกเตอร์ SSE ชื่อยังคงฟังดูดี


-2

มันมาจากโครงสร้างของเมทริกซ์ที่สร้างจากเวกเตอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.