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 ++.
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 ++.
Câu trả lời:
Đị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 S
n
, 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 vector
cửa hàng C ++ .
std::vector
không cung cấp, 3. Lập luận rằng std::vector
là 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_string
vv
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ì đó.
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."
Chỉ cần nói tại sao nó có thể không được gọi là array
: Bởi vì std::vector
có 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 };
std::array
có thể thay đổi kích thước sẽ không tốt.
Để 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à Scheme và Common 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.
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::vector
hỗ 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.
std::vector
khô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::vector
không đủ điều kiện như một vector. Tôi sẽ gọi nó dynamic_array
hoặc resizable_array
cho bạn biết nó là gì.
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.
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ể.
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. "
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".
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ứ ...
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.
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ò.
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 nxm
ma trận được gọi A
, trong đó n
tương ứng với số lượng hàng và m
tươ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 A
phạm vi và bạn cũng không thể mở rộng A
kí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 A
xuấ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 A
có 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.
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.