UFO ET IT

std :: set과 std :: vector의 차이점은 무엇입니까?

ufoet 2020. 11. 21. 08:38
반응형

std :: set과 std :: vector의 차이점은 무엇입니까?


지금 STL을 배우고 있습니다. 나는 set컨테이너 에 대해 읽었습니다 . 언제 사용하고 싶 set습니까? 세트에 대한 설명을 읽은 후에 vector. 당신은 프로와 COS는 말할 수 vectorset용기. 감사


A set가 주문됩니다. 제공하는 펑터에 따라 특정 순서로 유지되는 것이 보장 됩니다. 추가하거나 제거하는 요소에 관계없이 (에서 허용되지 않는 중복을 추가하지 않는 한 set) 항상 정렬됩니다.

A vector에는 명시 적으로 지정한 순서 있습니다. 의 항목은 항목 vector을 넣는 위치입니다. 순서가 맞지 않게 넣으면 순서가 맞지 않습니다. 이제 sort컨테이너를 다시 정렬해야합니다.

물론 set상대적으로 사용이 제한적입니다. 적절한 훈련을 통해 a에 항목을 삽입 vector하고 주문을 유지할 수 있습니다. 그러나 컨테이너에서 항목을 지속적으로 삽입하고 제거 vector하면 많은 문제가 발생합니다. 그것은 사실상 단지 배열이기 때문에 많은 요소 복사 / 이동 등을 수행 할 것입니다.

에 항목을 삽입하는 데 걸리는 시간은에 vector이미있는 항목 수에 비례합니다 vector. 항목을에 삽입하는 데 걸리는 시간은 항목 set수의 log₂비례 합니다. 항목 수가 많으면 큰 차이입니다. log₂ (100,000)은 ~ 16입니다. 속도가 크게 향상되었습니다. 제거도 마찬가지입니다.

그러나 모든 삽입을 초기화 시간에 한 번에 수행하면 문제가 없습니다. 에 모든 것을 삽입 vector하고 정렬 한 다음 (한 번 지불) sorted vectors대한 표준 알고리즘을 사용 하여 요소를 찾고 정렬 된 목록을 반복 할 수 있습니다. a의 요소에 대한 set반복이 정확히 느리지는 않지만 a를 반복하는 vector것이 더 빠릅니다.

따라서 정렬 vectorset. 즉, 필요하다는 것을 알지 못하는 한 이러한 종류의 최적화 비용을 정말로 신경 쓰지 말아야합니다. 그래서를 사용 set하면 시스템의 종류와 경험을하지 않는있는 거 쓰기 (따라서 그 성능이 필요하다는 것을 알고) 또는 당신이 필요로 있음을 알려줍니다 손에 프로파일 데이터가 vector아닌가 set.


그들은 다른 것입니다. 벡터의 순서를 결정하고 원하는만큼 동일한 것을 벡터에 넣을 수도 있습니다. 세트는 해당 세트의 내부 규칙에 따라 정렬되며 (규칙을 설정할 수 있지만 세트는 순서를 처리합니다) 여러 개의 동일한 항목을 세트에 넣을 수 없습니다.

물론 고유 한 항목의 벡터를 유지할 수는 있지만 집합 지향 작업을 수행하면 성능이 크게 저하됩니다. 예를 들어 10000 개의 항목 세트와 10000 개의 고유 한 순서가 지정되지 않은 항목의 벡터가 있다고 가정합니다. 이제 값 X가 집합의 값 (또는 벡터의 값)에 있는지 확인해야한다고 가정합니다. X가 항목에 없으면 벡터 검색이 약 100 배 느려집니다. 집합 합집합 및 교차를 계산할 때 유사한 성능 차이를 볼 수 있습니다.

요약하면 세트와 벡터는 서로 다른 목적을 가지고 있습니다. 세트 대신 벡터를 사용할 수 있지만 더 많은 작업이 필요하고 성능이 상당히 저하 될 수 있습니다.


벡터 (O (log (n)) 대 O (n))보다 집합에 대해 항목을 검색하는 것이 더 빠릅니다. 벡터에 대해 항목을 검색하려면 벡터의 모든 항목을 반복해야하지만 세트는 검색을 최적화하기 위해 빨간색-검정색 트리를 사용하며 일치하는 항목을 찾기 위해 몇 개의 항목 만 찾습니다.

세트는 순서가 지정됩니다. 즉, 가장 작은 것부터 가장 큰 것까지 순서 또는 역순으로 만 반복 할 수 있습니다.

그러나 벡터는 순서가 지정되지 않았으므로 삽입 순서로 이동할 수 있습니다.


양식 cpluplus.com 세트 :

집합은 특정 순서에 따라 고유 한 요소를 저장하는 컨테이너입니다.

따라서 세트가 주문되고 항목이 고유하게 표시됩니다.

vect 동안 :

벡터는 크기가 변경 될 수있는 배열을 나타내는 시퀀스 컨테이너입니다.

그래서 벡터는 당신이 그것을 채우는 순서이고 여러 개의 동일한 항목을 가질 수 있습니다

선호하는 세트 :

  • 여러 개의 동일한 값을 필터링하려는 경우
  • 지정된 순서로 항목을 구문 분석하려는 경우 (벡터에서이 작업을 수행하려면 특별히 벡터를 정렬해야 함).

벡터 선호 :

  • 동일한 값을 유지하려면
  • 푸시 한 것과 동일한 순서로 항목을 구문 분석하려는 경우 (벡터 순서를 처리하지 않는다고 가정)

참고 URL : https://stackoverflow.com/questions/8686725/what-is-the-difference-between-stdset-and-stdvector

반응형