C ++ Vector가 Vector라고 불리는 이유는 무엇입니까?


147

질문은 정말 자명합니다. 수학에서 벡터에 대해 모호하게 알고 있지만 실제로 C ++ 벡터에 대한 링크는 보이지 않습니다.


5
물리학의 벡터 (Magnitute + direction)는 단어 벡터를 듣는 순간 가장 먼저 떠오르는 것입니다.
RBT

답변:


109

벡터의 수학적 정의는 집합의 멤버이며, Sn특정 집합 ( S)의 순서가 지정된 값 시퀀스입니다 . 이것이 C ++이 vector저장하는 것입니다.


21
벡터는 일반적으로 물리학에서 사용하기 때문에 2-3 차원으로 만 간주됩니다. 그러나 더 일반적으로 수학에서, 그들은 단지 순서가있는 일련의 숫자를 의미합니다 (수학적 세트는 질서가 없으며 물건으로 채워진 가방과 같습니다). 벡터는 여러 요소를 가질 수 있습니다.
Joseph Garvin

8
vartec, 유클리드 벡터를 좌표 벡터로 표현할 수없고 그 반대도 가능합니까? 유클리드 공간에서 더 일반적인 벡터 공간과 동일한 것 (튜플)을 다르게 표현한 것입니다.
Calvin

6
@Joseph Garvin : 벡터에는 숫자 인 구성 요소가 없어도됩니다. 예를 들어, 특정 함수 집합을 사용하여 구성 요소가 함수 인 벡터 공간을 형성 할 수 있습니다.
제이슨

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
그러나 배열은 힙 할당을 사용하지 않으므로 효율적으로 이동하지 않습니다. 또한 std :: valarray, btw가 있습니다.
sellibitze

1
저렴한 이동이 필요한 힙에 할당 할 수 있습니다.

2
너무 늦었지만 그 교훈을 배웠다는 것을 알게되어 기쁩니다. ... typedef 또는 #define도 해결할 수 있습니다.
LearnCocos2D

4
Computer Science에는 캐시 무효화 및 이름 지정 작업이라는 두 가지 어려운 점이 있습니다. Phil Karlton
RBT

7
귀하의 답변에서 "[Alex Stepanov]가 실수했다고 인정합니다"라고 주장하려는 경우 인용을 제공 하시겠습니까?
Trevor Boyd Smith

56

Bjarne Stroustrup 의 C ++ 프로그래밍 언어 에서 발췌 :

" Varlarray 는 전통적인 수학적 벡터 이기 때문에 벡터 라고 말해야 하며 벡터배열 이라고 불려야한다고 주장 할 수 있습니다 . 그러나 이것이 용어가 진화 된 방식은 아닙니다."


51
Pfftt .. 그 사람은 무엇을 알고 있습니까. 나는이 "Bjarne Stroustrup"사람에 대해 들어 본 적이 없다.
Calvin

5
나는 단지 이전의 의견의 많은
유권자

16

이름은 선형 대수학에서 나옵니다. 여기서 벡터는 단 하나의 열 또는 단 하나의 행이있는 행렬입니다.


10

왜 그것이 호출되지 않았는지 말하기 위해 array: std::vector동적 크기가 있기 때문입니다 . 배열은 개념적으로 길이가 고정되어 있습니다. 그런데 다음 C ++ 표준 std::array에는 크기가 고정되어 일반 배열보다 선호되는 템플릿이 있습니다.

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

새로운 C ++ 표준이 아직 출시 되었습니까?
Johannes Jensen

1
벡터도 크기가 고정되어 있기 때문에 많은 대답이 아닙니다. 벡터는 순수한 값이며, 일부 추가 구조와 함께 추상 벡터 공간을 형성하는 세트의 요소입니다. 벡터의 "크기 변경"이라는 개념은 완전히 말이되지 않습니다.
sara

@kai 여기에 혼란이 있다고 생각합니다. 나는 단지이 이유에 대한 주장 하지 라는 배열 . 나는 그것이 왜 설명하는 시도하지 않은 특별히 라는 벡터 . 언어 표준화 이전에도 C ++의 배열은 크기가 항상 고정되어 있으므로 크기 조정 가능 클래스의 이름을 지정하는 std::array것은 좋지 않습니다.
Johannes Schaub-litb

이제 당신은 이것이 많은 대답이 아니라 유효한 의견이라고 올바르게 불평 할 수 있습니다. 지금까지는 귀하의 의견의 첫 번째 절반 문장 (쉼표까지)에 동의합니다. 그러나 이제 답변을 질문에 대한 의견으로 옮기기가 너무 늦었습니다. 귀하와 @ user12의 유용한 의견이 손실되기 때문입니다.
Johannes Schaub-litb

딜레마를 해결하기위한 타협으로 커뮤니티 위키를 만들었습니다. 이렇게하면 계정에서 얻은 모든 공감 포인트 및 공감 손실이 제거됩니다. 내 변장에 대한 독창적 인 의견에 대해 나에게 여전히 감사의 말을 전하고 싶은 사람은이 표현적인 의견을지지 할 수 있습니다.
Johannes Schaub-litb

10

@MarkRuzon의 탁월한 응답을 보완하려면 :

Alex는 현재 std :: vector라는 이름을 지정하기 위해 SchemeScheme 이라는 이름을 관찰했습니다. Common Lisp 지정하기 위해 가 비슷한 데이터 구조에 부여한 .

나중에 그는 자신이 틀렸다고 인정한다 C ++ 벡터가 수학의 벡터와 관련이 .

그는 또한 50 명으로 구성된 커뮤니티의 오류를 5 백만 명의 커뮤니티에 도입했으며 그 오류는 영원히 지속될 것이라고 말했다.


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. 여기서 1F곱셈 항등 을 나타냅니다 .

벡터 첨가에 대한 스칼라 곱셈의 분포  

a (u + v) = au + av

필드 추가에 대한 스칼라 곱셈의 분포

(a + b) v = av + bv


C ++ std::vector은 직접적으로가 아니라 C ++ 기능을 통해 이들을 모두 지원하므로 어떻게 든 벡터라고 부를 수 있지만 구어체 일뿐입니다. 예를 들어 "C ++ Programming Language"의Vallaray Bjarne Stroustrup이 지적한 것은 이들 중 일부를 직접 지원합니다.


3
C ++의 컨테이너에는 그러한 종류의 산술이 정의되어 있지 않으므로 C ++에는 벡터가 없습니다. 특히 a std::vector는 산술 연산을 지원하지 않으므로 이러한 속성은 모두에 대해 정의되지 않습니다 std::vector. 따라서 a std::vector는 벡터로 적합하지 않습니다. 나는 그것을 불렀 dynamic_array거나 resizable_array그것이 무엇인지 알려줄 것입니다.
user877329

4
또는 단순히 "목록". 하지만 noooooo ... " 모든 사람이 사용 하는 것이기 때문에"벡터 "가되어야 합니까?
LearnCocos2D

1
@ LearnCocos2D, 목록은 일반적으로 연결 목록으로 이해됩니다. 실제로 C ++ 표준 라이브러리에는 list라는 컨테이너가 이미 있습니다. 이중 연결 목록입니다.
Andrej

3

벡터는 단순히 동일한 유형의 일련의 값입니다. 이것은 수학에서의 사용과 거의 일치합니다. 벡터가 몇 가지 일반적인 작업 (예 : 스칼라에 의한 추가 및 스케일링)을 지원해야한다는 수학적 아이디어가 전달되지 않으며 중요한 측면은 주로 구조입니다.


수학에서 "벡터"가 나오는 선형 대수학에서 모든 것은 연산에 관한 것이며 모든 벡터는 같은 크기입니다. 선형 대수, 즉 연산 은 수학에서 많은 수의 벡터를 만드는 것입니다.
E4z9

3

또한 정수 또는 부동 소수점을 저장하면 N 차원 벡터를 저장하는 데 훌륭한 유형이됩니다. 모든 벡터는 모두 특정 순서로 유지되는 숫자 목록입니다.


이것은 그 벡터가 무엇인지 아닌, 노골적으로 거짓 en.wikipedia.org/wiki/Vector_space
사라

@kai 당신은 다른 지역에서도 이러한 갈등을 발견 할 것입니다. 일부 프로그래밍 언어의 실수 0.1는 수학 으로 저장할 수 없으며이 값은 실수 세트의 멤버입니다. Java 프로그래밍 언어 ( docs.oracle.com/javase/7/docs/api/java/util/Vector.html )에서 벡터는 "Vector 클래스는 확장 가능한 객체 배열을 구현합니다. 배열과 마찬가지로 정수 인덱스를 사용하여 액세스 할 수 있습니다. 그러나 Vector를 만든 후 항목을 추가하거나 제거 할 수 있도록 Vector의 크기를 늘리거나 줄일 수 있습니다. "
Johannes Schaub-litb

벡터가 무엇인지에 관해서 입니다 , 누구의 정의 사용에 따라 달라집니다. 이 질문은 math.stackexchange.com이 아닌 stackoverflow.com 에서 요청 되었으므로 여기서 수학 바이어스가 적은 접근 방식을 주장합니다.
Johannes Schaub-litb

@kai 벡터 공간과 관련하여 벡터의 정의에 익숙합니다. 또한 벡터는 단지 메모리에 인접한 숫자, 즉 배열의 목록 인 컴퓨터 과학 정의에 익숙합니다. 위키 백과의 벡터에 대한 명확성 페이지에서 하나의 의미가 1D 배열임을 보여줍니다. 이것은 적어도 70 년대 이후로 존재했던 벡터 프로세서에 사용되는 것과 정확히 동일한 의미입니다. 따라서 내가 준 정의는 엄격한 수학적 정의는 아니지만 이전의 컴퓨터 과학 정의입니다.
James Matta

3

오래 전에 B 언어로 에는 벡터 유형이 있습니다. 그런 다음 C 언어는 "배열"이라고 불렀습니다. 그런 다음 클래스가있는 C와 C ++ 언어가 방금 파생했습니다 ...

이것은 확실히 전체 이야기가 아닙니다. 위에서 언급했듯이 Stepanov는 실제 결정을 내 렸습니다. 그러나 C에서 "벡터"가 여전히 사용 된 경우 결과는 상당히 다르게 보일 수 있습니다.

추신. 왜 C가 "어레이"로 이름이 바뀌는 지 궁금합니다. 정확한 이유는 무엇입니까?

PS2. C ++와 같은 언어에 대한 IMO의 경우 배열은 "operator []를 통해 합리적으로 액세스 할 수있는 유형 보류 요소 (예 : 42 [some_array_object]가 아님), 예를 들어 std :: map을"associative array "로 인스턴스화하는 것이 더 좋습니다.


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


0

유형에 대한 매개 변수가 이름에 미치는 영향

여기에 열이 폭파됩니다. (일부 서버 측 ASP.NET HTML 인코딩 기술에 대한 소스보기)

아니면 행인가?

그런 다음 다시 MIMD 또는 SSE 벡터 머신 컨텍스트에서 생각하면 이름이 여전히 훌륭하게 들립니다.


-2

벡터에서 생성되는 행렬의 구조에서 비롯됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.