C ++ 11 범위 기반 루프 : 값으로 항목 가져 오기 또는 const 참조
범위 기반 루프의 몇 가지 예를 읽으면 두 가지 주요 방법 1 , 2 , 3 , 4 를 제안합니다.
std::vector<MyClass> vec;
for (auto &x : vec)
{
// x is a reference to an item of vec
// We can change vec's items by changing x
}
또는
for (auto x : vec)
{
// Value of x is copied from an item of vec
// We can not change vec's items by changing x
}
잘.
vec
항목을 변경할 필요가없는 경우 IMO, 예제에서는 두 번째 버전 (값 기준)을 사용하는 것이 좋습니다. 그들이 const
참조 하는 것을 제안하지 않는 이유 (적어도 직접적인 제안은 찾지 못했습니다) :
for (auto const &x : vec) // <-- see const keyword
{
// x is a reference to an const item of vec
// We can not change vec's items by changing x
}
더 좋지 않습니까? 그것이 반복되는 동안 각 반복에서 중복 사본을 피하지 const
않습니까?
항목을 변경하지 않고 사본을 만들지 않으 려면 auto const &
올바른 선택입니다.
for (auto const &x : vec)
당신이 사용하도록 제안하는 사람 auto &
은 잘못입니다. 그들을 무시하라.
요약하면 다음과 같습니다.
auto x
사본으로 작업 할 시간을 선택하십시오 .auto &x
원본 항목으로 작업 할 때 선택 하면 수정 될 수 있습니다.auto const &x
원본 항목으로 작업 할 때 선택 하면 수정되지 않습니다.
당신이있는 경우 std::vector<int>
또는 std::vector<double>
, 그것은 사용으로 잘의 auto
대신 (값의 사본을) const auto&
을 복사하기 때문에, int
또는이 double
저렴합니다 :
for (auto x : vec)
....
하지만이 경우 std::vector<MyClass>
, 어디에서 MyClass
일부 비 사소한 복사 의미가 있습니다 (예를 들어 std::string
, 일부 복잡한 사용자 정의 클래스 등) 그럼 내가 사용하는 것이 좋습니다 것입니다 const auto&
깊은 복사본을 피하기 위해 :
for (const auto & x : vec)
....
vec
항목을 변경할 필요가없는 경우 예제는 첫 번째 버전을 사용하는 것이 좋습니다.
그런 다음 잘못된 제안을합니다.
그들이 const 참조하는 것을 제안하지 않는 이유
그들은 잘못된 제안을하기 때문에 :-) 당신이 언급 한 것은 맞습니다. 객체 만 관찰 하려는 경우 사본을 만들 필요가 없으며 const
참조 하지 않아도됩니다 .
편집하다:
나는 당신이 연결하는 참조가 다양한 int
값이나 다른 기본 데이터 유형에 대해 반복하는 예를 제공한다는 것을 알았습니다 . 이 경우 복사는 int
비용이 많이 들지 않기 때문에 복사본을 만드는 것은 기본적으로을 관찰하는 것보다 효율적이지 않습니다 const &
.
그러나 이는 일반적으로 사용자 정의 유형의 경우에는 해당되지 않습니다. UDT는 복사 비용이 많이들 수 있으며, 원본을 변경하지 않고 검색된 객체를 수정하는 등 사본을 생성 할 이유가없는 경우에는을 사용하는 것이 좋습니다 const &
.
여기서는 반대로 auto const &
for 루프 기반 범위에서 필요가 없다고 말합니다 . 다음 기능이 어리석은 것으로 생각되면 알려주십시오 (그 목적이 아니라 작성 방식).
long long SafePop(std::vector<uint32_t>& v)
{
auto const& cv = v;
long long n = -1;
if (!cv.empty())
{
n = cv.back();
v.pop_back();
}
return n;
}
여기서 저자는 v
v를 수정하지 않는 모든 연산에 사용하기 위해 const 참조를 만들었습니다 . 이것은 어리석은 의견이며, auto const &
그냥 for 대신 루프 기반의 범위에서 변수로 사용하기 위해 동일한 인수를 만들 수 있습니다. auto &
.
'Programming' 카테고리의 다른 글
git은 공백과 탭을 자동으로 전환 할 수 있습니까? (0) | 2020.05.12 |
---|---|
MySQL 인덱스-모범 사례는 무엇입니까? (0) | 2020.05.12 |
CheckBox의 색상을 변경하는 방법은 무엇입니까? (0) | 2020.05.11 |
Rails 앱에서 모든 모델을 모을 수있는 방법이 있습니까? (0) | 2020.05.11 |
정수가 짝수인지 홀수인지 어떻게 확인합니까? (0) | 2020.05.11 |