"읽기 의미 체계에서 []을이 컨테이너 유형에 대한 의미 체계 작성으로 바꾸는 좋은 이유는 무엇입니까?"
조금 더 오래 생각하면 두 가지 이유가있을 수 있습니다. 첫 번째 이유는 효율성입니다. 실제 알고리즘과 의미가 삶을 더 쉽고 어렵게 만들지 여부를 반영하는 데 도움이됩니다. 현재 의미론이 빛나는 알고리즘 중 하나는 키와 관련된 값을 누적하는 것입니다. 당신은 당신이 원하는 될 가능성이 0으로 초기화되는 계수의 각 값에 의존 할 수 있기 때문에
void f(std::vector<std::pair<std::string, double> > const& v)
{
std::map<std::string, double> count;
for (size_t i = 0, sz = v.size(); i < sz; ++i) {
count[v[i].first] += v[i].second;
}
}
지도의 의미는이 경우에 좋은입니다.이 경우 각 키 및 값 쌍에 대해 하나의 검색 만 맵에 적용됩니다. 당신이 비교하면
그 (당신이 제안으로 키가없는 경우 예외를 throw) 파이썬은, 당신이 얻을으로 보이는 지저분하고 덜 효율적인 코드와 같은 :
def f(vec):
count = {}
for (k, v) in vec:
if count.has_key(k):
count[k] += v
else:
count[k] = v
또는 사용하여 약간 깔끔한 버전 GET()와 디폴트 값.
def g(vec):
count = {}
for (k, v) in vec:
count[k] = count.get(k, 0) + v
return count
두 버전 모두에서 사전에 대한 검색은 각 키 및 값 쌍에 대해 수행됩니다. 요구 사항에 따라 심각한 벌칙이 될 수 있습니다. 이 경우 C++ 맵 의미론이 효율적인 코드에 필요합니다.
C++에는 변경 사항을 보호하는 훌륭한 기능을하는 const가 있습니다. 가끔은 const가 대량으로 과소 평가 된 것으로 의심합니다. 귀하의 경우 const를 사용하면 연산자 []를 사용하여지도의 내용을 변경하지 못하게됩니다.
이 동작의 두 번째 좋은 이유는 여러 언어로 된 연관 배열의 동작과 같습니다. Awk 및 Perl과 같은 언어는 수십 년 동안 연관 배열에 대해 동일한 동작을 보였습니다. 이 언어에서오고 있다면, std :: map의 동작은 아마도 매우 직관적 일 것입니다.
'operator []'는 키를 사용하여지도의 요소에 액세스하는 데 사용됩니다. 이 연산자는'operator [] '를 통해 배열이나 벡터 요소에 접근하는 것과 어떻게 다른가요? – LeopardSkinPillBoxHat
이것은 내가 일반적으로 연산자 오버로드 된 메서드를 사용하지 않는 것을 선호하는 이유 중 하나입니다. 때로는 명확한 이름을 가진 메소드 (예 :'find','insert')를 사용하면보다 명확하고 읽기 쉬운 코드를 만들 수 있습니다. 다행히도 STL 컨테이너는 두 가지 모두를 제공하므로 적절한 시점에 적절한 것을 사용하도록 선택할 수 있습니다. – asveikau
질문의 핵심은 'operator []'는 키가 그렇지 않다. const가 아닌 연산이된다. 이것은 매우 놀라운 일이며,'vector' 나'deque' 나'string'에서 비슷한 동작이 없습니다. –