답변:
벡터의 수학적 정의는 집합의 멤버이며, Sn특정 집합 ( S)의 순서가 지정된 값 시퀀스입니다 . 이것이 C ++이 vector저장하는 것입니다.
std::vector제공하지 않습니다, 3. 인수 std::vector값의 정렬 된 순서입니다 적용 할 수로 std::list, std::deque, std::basic_string, 등
표준 템플릿 라이브러리의 디자이너 인 Alex Stepanov는 내장 배열과 구별 할 이름을 찾고 있었기 때문에 벡터라고합니다. 수학은 이미 고정 길이의 숫자 시퀀스에 '벡터'라는 용어를 사용하기 때문에 실수를 저지른 것을 인정합니다. C ++ 11은 수학 벡터와 유사하게 동작하는 클래스 '배열'을 도입하여이 실수를 복잡하게 만듭니다.
Alex의 교훈 : 이름을 지정할 때마다 매우주의하십시오.
왜 그것이 호출되지 않았는지 말하기 위해 array: std::vector동적 크기가 있기 때문입니다 . 배열은 개념적으로 길이가 고정되어 있습니다. 그런데 다음 C ++ 표준 std::array에는 크기가 고정되어 일반 배열보다 선호되는 템플릿이 있습니다.
std::array<int, 4> f = { 1, 2, 3, 4 };
std::array것은 좋지 않습니다.
@MarkRuzon의 탁월한 응답을 보완하려면 :
Alex는 현재 std :: vector라는 이름을 지정하기 위해 Scheme 과 Scheme 이라는 이름을 관찰했습니다. Common Lisp 지정하기 위해 가 비슷한 데이터 구조에 부여한 .
나중에 그는 자신이 틀렸다고 인정한다 C ++ 벡터가 수학의 벡터와 관련이 .
그는 또한 50 명으로 구성된 커뮤니티의 오류를 5 백만 명의 커뮤니티에 도입했으며 그 오류는 영원히 지속될 것이라고 말했다.
그냥 이름입니다. C ++ 벡터 는 동적 배열 또는 크기 조정 가능한 배열 이라고 할 수 있지만 훨씬 더 정확할 수 있지만이 이름은 단순히 선택되었습니다 . 이 벡터 때문에 벡터 모든 집합의 구성원 수학 methematics 행 벡터와 동일하지 V 개의 중요한 존재하도록 조작 이 세트에 정의 + (벡터 첨가) 및 X (a 벡터의 승산이 분야에서 스칼라 F ) 및 이러한 작업은 8 개의 공리를 충족합니다 .
덧셈의 결합 법칙
u + (v + w) = (u + v) + w
첨가의 전산
u + v = v + u
추가의 정체성 요소
요소 0 ∈이 존재 V 호출, 영 벡터 , 모든 V ∈에 대한이되도록 V + 0 = V V는 .
더하기의 역 원소
모든 v ∈ V마다 v + (−v) = 0이 되도록 v의 역수 라고하는 -v ∈ V 요소가 있습니다.
스칼라 곱셈과 필드 곱셈의 호환성
a (bv) = (ab) v
스칼라 곱셈의 항등 요소
1 v = v. 여기서 1 은 F 의 곱셈 항등 을 나타냅니다 .
벡터 첨가에 대한 스칼라 곱셈의 분포
a (u + v) = au + av
필드 추가에 대한 스칼라 곱셈의 분포
(a + b) v = av + bv
C ++ std::vector은 직접적으로가 아니라 C ++ 기능을 통해 이들을 모두 지원하므로 어떻게 든 벡터라고 부를 수 있지만 구어체 일뿐입니다. 예를 들어 "C ++ Programming Language"의Vallaray Bjarne Stroustrup이 지적한 것은 이들 중 일부를 직접 지원합니다.
std::vector는 산술 연산을 지원하지 않으므로 이러한 속성은 모두에 대해 정의되지 않습니다 std::vector. 따라서 a std::vector는 벡터로 적합하지 않습니다. 나는 그것을 불렀 dynamic_array거나 resizable_array그것이 무엇인지 알려줄 것입니다.
또한 정수 또는 부동 소수점을 저장하면 N 차원 벡터를 저장하는 데 훌륭한 유형이됩니다. 모든 벡터는 모두 특정 순서로 유지되는 숫자 목록입니다.
0.1는 수학 으로 저장할 수 없으며이 값은 실수 세트의 멤버입니다. Java 프로그래밍 언어 ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html )에서 벡터는 "Vector 클래스는 확장 가능한 객체 배열을 구현합니다. 배열과 마찬가지로 정수 인덱스를 사용하여 액세스 할 수 있습니다. 그러나 Vector를 만든 후 항목을 추가하거나 제거 할 수 있도록 Vector의 크기를 늘리거나 줄일 수 있습니다. "
오래 전에 B 언어로 에는 벡터 유형이 있습니다. 그런 다음 C 언어는 "배열"이라고 불렀습니다. 그런 다음 클래스가있는 C와 C ++ 언어가 방금 파생했습니다 ...
이것은 확실히 전체 이야기가 아닙니다. 위에서 언급했듯이 Stepanov는 실제 결정을 내 렸습니다. 그러나 C에서 "벡터"가 여전히 사용 된 경우 결과는 상당히 다르게 보일 수 있습니다.
추신. 왜 C가 "어레이"로 이름이 바뀌는 지 궁금합니다. 정확한 이유는 무엇입니까?
PS2. C ++와 같은 언어에 대한 IMO의 경우 배열은 "operator []를 통해 합리적으로 액세스 할 수있는 유형 보류 요소 (예 : 42 [some_array_object]가 아님), 예를 들어 std :: map을"associative array "로 인스턴스화하는 것이 더 좋습니다.
행 벡터 라는 용어에서 비롯된 것 같습니다 . 또한 컴퓨터 과학자들은 사물에 대한 새로운 이름을 생각하는 것을 좋아합니다 ...
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. 이 예에서는 해당 벡터의 각 벡터 크기를 독립적으로 변경하는 방법을 보여주기 때문에 해당 벡터를 "정지됨"이라고했습니다. 특정 벡터가 수학에 도입되면 치수를 변경할 수없는 방법에 대한 규칙을 위반할뿐만 아니라 매트릭스로 사용할 수없는 방법도 보여줍니다.