반복자를 2 씩 증가시키는 방법은 무엇입니까?
아무도 반복자를 2 씩 증가시키는 방법을 말해 줄 수 있습니까?
iter++
사용할 수 있습니다-해야합니까 iter+2
? 이것을 어떻게 달성 할 수 있습니까?
이 메서드는 임의 액세스 반복자가 아닌 반복자에 대해 작동하지만 iter += 2
임의 액세스 반복기와 함께 사용할 때보 다 덜 효율적 이도록 구현에 의해 전문화 될 수 있습니다 .
http://www.cplusplus.com/reference/std/iterator/advance/
std::advance(it,n);
귀하의 경우 n은 2입니다.
이 함수의 장점은 "it"이 임의 액세스 반복자 인 경우
it += n
연산이 사용됩니다 (예 : vector <,,> :: iterator). 그렇지 않으면 렌더링
for(int i = 0; i < n; i++)
++it;
(예 : list <..> :: iterator)
이터레이터의 수정 가능한 lvalue가 없거나 지정된 이터레이터의 복사본을 가져 오려는 경우 (원래를 변경하지 않고) C ++ 11에는 새로운 도우미 함수가 제공됩니다- std::next
/ std::prev
:
std::next(iter, 2); // returns a copy of iter incremented by 2
std::next(std::begin(v), 2); // returns a copy of begin(v) incremented by 2
std::prev(iter, 2); // returns a copy of iter decremented by 2
'덧셈에 의한 할당'연산자를 사용할 수 있습니다.
iter += 2;
컨테이너에 다음 요소가 충분한 지 여부를 모르는 경우 각 증분 사이에 컨테이너의 끝을 확인해야합니다. ++도 std :: advance도이 작업을 수행하지 않습니다.
if( ++iter == collection.end())
... // stop
if( ++iter == collection.end())
... // stop
자신의 바운드 보안 사전 기능을 롤링 할 수도 있습니다.
끝을 지나지 않을 것이라고 확신하는 경우 std :: advance (iter, 2)가 최상의 솔루션입니다.
std :: advance 와 std :: next를 모두 사용할 수 있지만 둘 사이에는 차이가 있습니다.
advance
인수를 수정하고 아무것도 반환하지 않습니다. 따라서 다음과 같이 사용할 수 있습니다.
vector<int> v;
v.push_back(1);
v.push_back(2);
auto itr = v.begin();
advance(itr, 1); //modifies the itr
cout << *itr<<endl //prints 2
next
반복자의 수정 된 복사본을 반환합니다.
vector<int> v;
v.push_back(1);
v.push_back(2);
cout << *next(v.begin(), 1) << endl; //prints 2
목록 크기가 짝수 단계가 아닐 수 있다고 가정하면 오버플로를 방지해야합니다.
static constexpr auto step = 2;
// Guard against invalid initial iterator.
if (!list.empty())
{
for (auto it = list.begin(); /*nothing here*/; std::advance(it, step))
{
// do stuff...
// Guard against advance past end of iterator.
if (std::distance(it, list.end()) > step)
break;
}
}
컬렉션 구현에 따라 거리 계산이 매우 느릴 수 있습니다. 아래는 최적이며 더 읽기 쉽습니다. 클로저는 const 참조에 의해 전달 된 목록 끝 값이있는 유틸리티 템플릿으로 변경 될 수 있습니다.
const auto advance = [&](list_type::iterator& it, size_t step)
{
for (size_t i = 0; it != list.end() && i < step; std::next(it), ++i);
};
static constexpr auto step = 2;
for (auto it = list.begin(); it != list.end(); advance(it, step))
{
// do stuff...
}
루핑이없는 경우 :
static constexpr auto step = 2;
auto it = list.begin();
if (step <= list.size())
{
std::advance(it, step);
}
아주 간단한 대답 :
++++iter
긴 대답 :
++iter
대신 쓰기에 익숙해 져야합니다 iter++
. 후자는 새 값과 다른 이전 값을 반환해야합니다 (복사본). 이것은 시간과 공간이 필요합니다.
접두사 increment ( ++iter
)는 lvalue를 취하고 lvalue를 반환하는 반면, postfix increment ( iter++
)는 lvalue를 취하고 rvalue를 반환합니다.
참고URL : https://stackoverflow.com/questions/1057529/how-to-increment-an-iterator-by-2
'IT Share you' 카테고리의 다른 글
Lodash : orderBy를 사용하여 컬렉션에서 대소 문자를 구분하지 않는 정렬을 수행하는 방법은 무엇입니까? (0) | 2020.11.26 |
---|---|
Throwables를 잡을 수 있는데 Java에서 예외를 잡는 이유는 무엇입니까? (0) | 2020.11.26 |
MySQL SELECT 지난 며칠? (0) | 2020.11.26 |
설치 불가능한 Fiddler 버전 또는 이와 동등한 버전이 있습니까? (0) | 2020.11.26 |
BackgroundWorker를 사용하는 방법? (0) | 2020.11.26 |