이 SO 답변에 따르면 벡터에 대한 벡터가있는 STL 맵 벡터를 키로 사용할 수 있습니다. 벡터를 키로 사용할 때 키가 고유해야하기 때문에 실제로 어떻게 작동합니까? 동일한 요소를 가진 다른 벡터를 삽입 할 때 map
요소별로 요소를 중복 검사하거나 벡터 이름이 무언가를 지정합니까? 배열의 이름은 기본 주소를 나타냅니다. 따라서 기본 주소는 키로 사용될 수 있지만 벡터의 경우 키는 무엇인지 때문에 배열은 키로 사용할 수 있습니다. 내부적으로 어떻게 작동합니까?
벡터의 이름을 인쇄하면 오류가 발생하기 때문에
vector<int> v;
cout<<v; //error
답변
클래스 템플릿 std :: vector에 대해 오버로드 된 연산자 <가 있습니다.
template <class T,
class Allocator>
bool operator< (const vector<T, Allocator>& x, const vector<T, Allocator>& y);
표준 알고리즘을 기반으로합니다 std::lexicographical_compare
.
다음은 실증 프로그램입니다.
#include <iostream>
#include <iomanip>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v1 = { 1, 2 };
std::vector<int> v2 = { 1, 2, 3 };
std::vector<int> v3 = { 2 };
std::cout << std::boolalpha << ( v1 < v2 ) << '\n';
std::cout << std::lexicographical_compare( std::begin( v1 ), std::end( v1 ),
std::begin( v2 ), std::end( v2 ) )
<< '\n';
std::cout << std::boolalpha << ( v1 < v3 ) << '\n';
std::cout << std::lexicographical_compare( std::begin( v1 ), std::end( v1 ),
std::begin( v3 ), std::end( v3 ) )
<< '\n';
std::cout << std::boolalpha << ( v2 < v3 ) << '\n';
std::cout << std::lexicographical_compare( std::begin( v2 ), std::end( v2 ),
std::begin( v3 ), std::end( v3 ) )
<< '\n';
return 0;
}
출력은
true
true
true
true
true
true
따라서 클래스는 맵에서 키로 사용될 수 있습니다.
기본적으로 클래스 템플릿 맵은 std :: less 함수 객체를 사용합니다.
template <class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T>>>
class map
{
//...
};
그러나 클래스 템플릿 std :: vector에 대해 오버로드 된 연산자 <<가 없습니다.
답변
개체 이름과 해당 개체의 내용은 항상 관련이 없습니다.
operator ==
for std::vector
는 먼저 벡터의 길이를 비교 한 다음 사용하는 각 요소를 비교 operator ==
합니다.
operator <
벡터의 요소를 사전 식으로 비교합니다. 즉, x[i] < y[i]
벡터 x
와 의 첫 번째 같지 않은 요소를 반환 합니다 y
.
로 std::map
사용되는 유형에 대한 요구 사항 이 Key
있습니다. 이후 std::vector
모두 만족이를 등으로 사용될 수있다 Key
. 벡터에 의해 관리되는 유형에는이 연산자가 오버로드되어 있어야 작동합니다 ( std::vector
자체 연산자를 구현하려면 해당 연산자에 의존 하기 때문에 ).