답변:
벡터의 수학적 정의는 집합의 멤버이며, S
n
특정 집합 ( 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
. 이 예에서는 해당 벡터의 각 벡터 크기를 독립적으로 변경하는 방법을 보여주기 때문에 해당 벡터를 "정지됨"이라고했습니다. 특정 벡터가 수학에 도입되면 치수를 변경할 수없는 방법에 대한 규칙을 위반할뿐만 아니라 매트릭스로 사용할 수없는 방법도 보여줍니다.