Tại sao Vector C ++ được gọi là Vector?


147

Câu hỏi khá tự giải thích thực sự. Tôi biết mơ hồ về các vectơ trong toán học, nhưng tôi không thực sự thấy liên kết đến các vectơ C ++.


5
Các vectơ (Magnolarship + direction) trong vật lý là điều đầu tiên đập vào tâm trí tôi ngay khi tôi nghe các vectơ từ.
RBT

Câu trả lời:


109

Định nghĩa toán học của một vectơ là một thành viên của tập hợp Sn, là một chuỗi các giá trị theo thứ tự trong một tập hợp cụ thể ( S). Đây là những gì một vectorcửa hàng C ++ .


21
Các vectơ chỉ thường được xem xét 2-3 chiều vì sử dụng chúng trong vật lý. Nhưng nói chung hơn trong toán học, chúng chỉ có nghĩa là một tập hợp các số có một thứ tự (các bộ toán học là vô trật tự, chúng giống như một cái túi chứa đầy đồ đạc). Một vectơ có thể có bất kỳ số phần tử.
Joseph Garvin

8
vartec, vectơ Euclide có thể được biểu diễn dưới dạng vectơ tọa độ và ngược lại không? Chúng chỉ là các biểu diễn khác nhau của cùng một thứ (một tuple) trong không gian Euclidian so với không gian vectơ tổng quát hơn.
Calvin

6
@Joseph Garvin: Các vectơ thậm chí không cần phải có các thành phần là số. Ví dụ, một số bộ hàm nhất định có thể được sử dụng để tạo thành các không gian vectơ trong đó các thành phần là các hàm.
jason

13
Một vector có nghĩa đen là một "tàu sân bay". Cùng một từ được sử dụng cho (ví dụ) côn trùng truyền bệnh và xuất phát từ cùng một gốc Latin là "phương tiện". Vì vậy, đó là một cái gì đó đưa bạn từ nơi này đến nơi khác. Ngẫu nhiên, từ "ma trận" cũng có nguồn gốc từ tiếng Latin, có nghĩa là "tử cung".
Artelius

6
Những dường như không đạt yêu cầu vì: 1. vectơ Toán học không thay đổi trong kích thước, 2. vectơ toán học có hoạt động mà std::vectorkhông cung cấp, 3. Lập luận rằng std::vectorlà một chuỗi các lệnh của các giá trị có thể áp dụng cho std::list, std::deque, std::basic_stringvv
jamesdlin

188

Nó được gọi là vectơ vì Alex Stepanov, người thiết kế Thư viện mẫu tiêu chuẩn, đang tìm kiếm một tên để phân biệt với các mảng tích hợp. Bây giờ anh ta thừa nhận rằng mình đã phạm sai lầm, vì toán học đã sử dụng thuật ngữ 'vectơ' cho một chuỗi số có độ dài cố định. C ++ 11 kết hợp lỗi này bằng cách giới thiệu một 'lớp' hoạt động tương tự như một vectơ toán học.

Bài học của Alex: hãy thật cẩn thận mỗi khi bạn đặt tên cho một cái gì đó.


1
Nhưng mảng cũng sẽ không sử dụng phân bổ heap khiến việc di chuyển nó kém hiệu quả hơn. Chúng tôi cũng có std :: valarray, btw.
sellibitze

1
Bạn có thể phân bổ nó trên đống là di chuyển giá rẻ là mong muốn.

2
Rất vui khi biết rằng họ đã học được bài học đó mặc dù đã quá muộn. Mặc dù ... typedef hoặc #define cũng có thể sửa nó.
LearnCocos2D

4
Chỉ có hai điều khó trong Khoa học máy tính: vô hiệu hóa bộ đệm và đặt tên - Phil Karlton
RBT

7
nếu bạn định tuyên bố "[Alex Stepanov] thừa nhận rằng anh ấy đã mắc lỗi" trong câu trả lời của bạn, bạn có thể vui lòng cung cấp một trích dẫn không?
Trevor Boyd Smith

56

Một đoạn trích từ Ngôn ngữ lập trình C ++ của Bjarne Stroustrup:

"Người ta có thể lập luận rằng valarray nên được gọi là vectơ vì nó là vectơ toán học truyền thống và vectơ đó nên được gọi là mảng . Tuy nhiên, đây không phải là cách thuật ngữ phát triển."


51
Pfftt .. anh chàng đó biết gì. Tôi thậm chí chưa bao giờ nghe nói về người "Bjarne Stroustrup" này.
Calvin

5
Tôi chỉ tự hỏi có bao nhiêu upvote của bình luận trước đó thực sự là kết quả của một dòng
chảy

16

Tên đến từ đại số tuyến tính, trong đó vectơ là ma trận chỉ có một cột hoặc chỉ một hàng.


10

Chỉ cần nói tại sao nó có thể không được gọi là array: Bởi vì std::vectorcó kích thước động. Một mảng về mặt khái niệm được cố định về chiều dài. Bằng cách này std::array, tiêu chuẩn C ++ tiếp theo có một mẫu, được cố định về kích thước và nên được ưu tiên hơn một mảng đơn giản:

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

Tiêu chuẩn C ++ mới này đã được phát hành chưa?
Julian Jensen

1
đây không phải là nhiều câu trả lời, vì một vectơ cũng có kích thước cố định. vectơ là các giá trị thuần túy, chúng là các phần tử trong một tập hợp cùng với một số cấu trúc bổ sung tạo thành một không gian vectơ trừu tượng. khái niệm "thay đổi kích thước" của một vectơ là hoàn toàn vô nghĩa.
sara

@kai tôi nghĩ có một sự nhầm lẫn ở đây. Tôi chỉ đơn thuần tranh luận về lý do tại sao nó không được gọi là mảng . Tôi đã không cố gắng để giải thích lý do tại sao nó đặc biệt được gọi là vector . Một mảng trong C ++ ngay cả trước khi tiêu chuẩn hóa ngôn ngữ luôn có kích thước cố định, vì vậy việc đặt tên lớp std::arraycó thể thay đổi kích thước sẽ không tốt.
Julian Schaub - litb

bây giờ bạn có thể phàn nàn rằng đây không phải là một câu trả lời, mà là một nhận xét hợp lệ. Trong chừng mực tôi đồng ý với nửa câu đầu tiên (tối đa dấu phẩy) của bình luận của bạn. Tuy nhiên, bây giờ đã quá muộn để chuyển câu trả lời của tôi thành một nhận xét cho câu hỏi, bởi vì những nhận xét hữu ích này của bạn và @ user12 sẽ bị mất.
Julian Schaub - litb

Như một sự thỏa hiệp để giải quyết vấn đề nan giải, tôi đã đưa ra câu trả lời wiki cộng đồng. Điều này loại bỏ tất cả các điểm upvote và downvote tổn thất tôi nhận được từ tài khoản của mình. Nếu bất cứ ai vẫn muốn cảm ơn tôi vì lời bình luận khéo léo của tôi, họ có thể nêu lên nhận xét mang tính đại diện này.
Julian Schaub - litb

10

Để bổ sung cho phản hồi tuyệt vời từ @MarkRuzon:

Alex nói rằng để đặt tên cho cái mà ngày nay gọi là std :: vector, anh đã quan sát cái tên mà SchemeCommon Lisp đã đặt cho các cấu trúc dữ liệu tương tự.

Sau đó, ông thừa nhận mình đã sai vì vectơ C ++ không liên quan gì đến các vectơ trong toán học.

Ông cũng nói rằng ông đã giới thiệu một lỗi của một cộng đồng 50 người cho một cộng đồng 5 triệu người, vì vậy lỗi này có thể sẽ tồn tại mãi mãi.


5

Nó chỉ là cái tên. Vectơ C ++ rất có thể (hoặc thậm chí chính xác hơn) được gọi là mảng động hoặc mảng có thể thay đổi kích thước nhưng tên này được chọn đơn giản . Đây vector là không giống như vector từ methematics vì trong toán học vectơ là thành viên của bất kỳ tập V như rằng có hai quan trọng hoạt động xác định trên nhóm này: + (bổ sung các vectơ) và x (nhân của một vector bởi một vô hướng từ lĩnh vực F ) và các hoạt động này đáp ứng 8 tiên đề :


Kết hợp bổ sung

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

Giao hoán của bổ sung

u + v = v + u

Yếu tố nhận dạng của sự bổ sung

Có tồn tại một phần tử 0 ∈ V , được gọi là vector zero , sao cho v + 0 = v cho tất cả v ∈ V .

Các yếu tố nghịch đảo của phép cộng

Với mọi v ∈ V, tồn tại một phần tử −v V , được gọi là nghịch đảo cộng gộp của v, sao cho v + (v) = 0

Khả năng tương thích của phép nhân vô hướng với phép nhân trường

a (bv) = (ab) v

Yếu tố nhận dạng của phép nhân vô hướng

1 v = v, nơi 1 biểu thị sắc chất nhân trong F .

Phân phối của phép nhân vô hướng đối với phép cộng vector  

a (u + v) = au + av

Phân phối của phép nhân vô hướng đối với phép cộng trường

(a + b) v = av + bv


C ++ std::vectorhỗ trợ tất cả chúng (không trực tiếp, nhưng thông qua các tính năng của C ++), do đó, bằng cách nào đó nó có thể được gọi là vectơ, nhưng nó chỉ là thông tục và ví dụ Vallarayđược Bjarne Stroustrup chỉ ra trong "Ngôn ngữ lập trình C ++" hỗ trợ trực tiếp một số trong số chúng.


3
Không có container nào trong C ++ có loại số học được định nghĩa nên không có vectơ trong C ++. Cụ thể, a std::vectorkhông hỗ trợ các phép toán số học, và do đó, tất cả các thuộc tính này không được xác định cho a std::vector. Vì vậy, a std::vectorkhông đủ điều kiện như một vector. Tôi sẽ gọi nó dynamic_arrayhoặc resizable_arraycho bạn biết nó là gì.
dùng877329

4
Hoặc đơn giản là "danh sách". Nhưng không, nó phải là "véc tơ" bởi vì đó là những gì mọi người sử dụng, phải không?
LearnCocos2D

1
@ LearnCocos2D, tốt, một danh sách thường được hiểu là một danh sách được liên kết. Trên thực tế, đã có một danh sách được gọi là danh sách trong thư viện chuẩn C ++ - đó là danh sách được liên kết đôi.
Andrej

3

Một vectơ chỉ đơn giản là một chuỗi các giá trị, tất cả cùng loại. Điều này là khá nhiều phù hợp với việc sử dụng trong toán học. Tôi đoán ý tưởng toán học rằng các vectơ nên hỗ trợ một số hoạt động phổ biến (như thêm và nhân rộng bằng vô hướng) không được thực hiện, khía cạnh quan trọng chủ yếu là cấu trúc.


Trong đại số tuyến tính, trong đó "vectơ" xuất phát từ toán học, mọi thứ đều là về các phép toán, với tất cả các vectơ có cùng kích thước. Đại số tuyến tính, do đó, các phép toán , là những gì làm cho một loạt các số trở thành một vectơ trong toán học.
E4z9

3

Ngoài ra nếu bạn làm cho nó lưu các số nguyên hoặc các dấu phẩy động thì nó sẽ tạo ra một loại tuyệt vời để lưu trữ các vectơ N chiều. Sau khi tất cả một vectơ là, một danh sách các số được giữ theo một thứ tự cụ thể.


Điều này hoàn toàn sai, đó không phải là một vectơ en.wikipedia.org/wiki/Vector_space
sara

@kai Bạn sẽ tìm thấy những xung đột trong các lĩnh vực khác. Các số thực trong một số ngôn ngữ lập trình sẽ không thể lưu trữ 0.1, trong các toán học, giá trị này là một thành viên của tập hợp các số thực. Trong ngôn ngữ lập trình Java ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html ) một vectơ là "Lớp Vector thực hiện một mảng các đối tượng có thể phát triển. Giống như một mảng, nó chứa các thành phần chứa có thể được truy cập bằng chỉ số nguyên. Tuy nhiên, kích thước của Vector có thể tăng hoặc thu hẹp khi cần để thêm và xóa các mục sau khi Vector được tạo. "
Julian Schaub - litb

Đối với một vectơ là gì , nó phụ thuộc vào định nghĩa bạn sử dụng. Vì câu hỏi này đã được hỏi trên stackoverflow.com , thay vì trên math.stackexchange.com , tôi sẽ tranh luận về cách tiếp cận ít sai lệch về toán học ở đây.
Julian Schaub - litb

@kai Tôi khá quen thuộc với định nghĩa của vectơ liên quan đến không gian vectơ. Tôi cũng quen thuộc với các định nghĩa khoa học máy tính, trong đó một vectơ chỉ là một danh sách các số liền kề trong bộ nhớ, tức là một mảng. Lưu ý rằng trong trang định hướng cho vectơ trong wikipedia rằng chúng hiển thị một ý nghĩa là mảng 1D. Đây chính xác là cùng một nghĩa được sử dụng cho các bộ xử lý vector, đã có từ ít nhất là những năm 70. Do đó, trong khi định nghĩa tôi đưa ra không phải là định nghĩa toán học nghiêm ngặt, nó là định nghĩa khoa học máy tính, mặc dù cũ hơn.
James Matta

3

Từ lâu, trong ngôn ngữ B có các loại vectơ. Sau đó, ngôn ngữ C gọi chúng là "mảng". Sau đó, C với Classes và ngôn ngữ C ++ đã bắt nguồn ...

Đây chắc chắn không phải là toàn bộ câu chuyện. Như đã đề cập ở trên, Stepanov đã đưa ra quyết định thực tế. Nhưng nếu "vectơ" vẫn được sử dụng trong C, kết quả có thể trông khá khác nhau.

Tái bút Tôi tự hỏi tại sao C đổi tên "mảng". Lý do chính xác là gì?

PS2. IMO cho một ngôn ngữ là C ++, một mảng có nghĩa tốt hơn là "một phần tử giữ kiểu được truy cập hợp lý thông qua toán tử []" (tức là không phải 42 [some_array_object]), ví dụ như một bản dựng của std :: map như một "mảng kết hợp".


2

Tôi đoán nó đến từ vector hàng hạn . Ngoài ra, các nhà khoa học máy tính thích nghĩ ra những cái tên mới cho những thứ ...


2

nhưng các vectơ toán học không động, tôi chưa bao giờ thấy một sự thay đổi nào từ 2D sang 3D hay bất cứ điều gì khác, nếu bất cứ điều gì các mảng truyền thống tạo ra các vectơ tốt hơn.


chắc chắn các vectơ toán học được xem xét trong nhiều chiều. Nếu bằng cách động, bạn có nghĩa là vectơ thay đổi kích thước của nó thì nó có thể dễ dàng tương ứng với toán học "xem xét vectơ này theo chiều x" bằng cách thêm hoặc cắt các tọa độ. Một phép biến đổi tuyến tính đơn giản có thể ánh xạ các vectơ từ không gian n-dim sang các vectơ trong không gian m-dim. Các vectơ toán học là RẤT năng động.
4pie0

1

Không biết lý do thực sự, nhưng C ++ gọi nó là một vectơ thay vì một mảng, làm giảm sự nhầm lẫn giữa các cấu trúc C và C ++, mặc dù chúng thực hiện cùng một vai trò.


1

Hãy nghĩ về một vectơ C ++ như một mảng động, kích thước có thể được thay đổi bằng cách chèn hoặc loại bỏ các phần tử. Chúng không liên quan đến định nghĩa toán học của vectơ.

Các vectơ trong toán học

Hãy xem xét một nxmma trận được gọi A, trong đó ntương ứng với số lượng hàng và mtương ứng với số lượng cột. Trong ngữ cảnh toán học, một khi bạn giới thiệu một ma trận như thế này, thì sau đó, bạn không thể thực hiện bất kỳ thao tác nào ngoài Aphạm vi và bạn cũng không thể mở rộng Akích thước. Điều này có nghĩa là bạn không thể tham khảo một chỉ mục [n + 1]và / hoặc [m + 1].

Bây giờ, một vectơ cũng Axuất phát các thuộc tính này, trong khi kích thước của chúng sẽ luôn là 1xm(bất kỳ [i]hàng nào được chọn trong A) hoặc nx1(bất kỳ [j]cột nào được chọn trong A). Một vectơ cũng không thể được chỉ định là 2xn, bởi vì một tập hợp các vectơ không thể được hiểu là một vectơ, trong khi một vectơ - hãy để đó là [i]vectơ cột Acó kích thước của 1xm- có thể được hiểu là ma trận.

Điểm quan trọng là bạn không thể thay đổi kích thước của vectơ một khi nó được giới thiệu về mặt toán học.

Các vectơ trong C ++

Trong C ++, vectơ giống như vectơ trong toán học, nhưng không giống như trong toán học, kích thước của chúng có thể bị thay đổi . Kích thước như một thuật ngữ áp dụng ở đây vì nó ngụ ý số phần tử mà một vectơ cụ thể chứa.

Bạn sử dụng các kích thước thuật ngữ theo các vectơ C ++, khi bạn có một vectơ vectơ : std::vector<std::vector<T>>> ragged_array. Trong ví dụ này, tôi gọi vectơ đó là "rách rưới", bởi vì nó cho thấy kích thước của mỗi vectơ đó có thể được thay đổi độc lập như thế nào. Nó không chỉ vi phạm các quy tắc về cách thay đổi kích thước một khi một vectơ cụ thể được giới thiệu trong toán học, mà còn chứng minh, làm thế nào nó không thể được sử dụng như một ma trận.


0

Các kỳ quan mà tham số về các loại không đặt tên ..

ở đây một cột bị nổ tung .. (xem nguồn cho một số kỹ năng mã hóa ASP.NET HTML phía máy chủ)

hoặc là một hàng?

Sau đó, một lần nữa, nghĩ về nó trong bối cảnh máy vectơ MIMD hoặc thậm chí SSE, cái tên vẫn nghe có vẻ tốt.


-2

nó xuất phát từ cấu trúc của ma trận xây dựng từ các vectơ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.