c++ vector iterator에 관한 질문입니다!
글쓴이: greathero / 작성시간: 월, 2013/09/23 - 11:04오전
vector안에 문자열들이 저장되어 있구요.
저장된 문자열들을 하나하나 인출해서 새로운 newStr이라는 것을 만들어서 다시 해당 vector에 push_back을 하고 싶습니다.
그런데 아래 코드처럼 하니 vector iterator not incrementable이라는 에러 메시지가 뜨네요.
도무지 문제의 원인이 뭔질 몰라서 질문드립니다.
어떻게 하면 원하는대로 push_back을 할 수 있을까요?
꼭 도움 주시면 감사하겠습니다~^^
for(auto it = v->begin(); it != v->end(); ++it) { string word = *it; for(int i = 0; i <= word.length(); ++i) { string newStr = word.substr(0, i) + firstChar + word.substr(i); v->push_back(newStr); } }
Forums:
v->push_back(newStr) 부분이 원인입니다.
http://en.cppreference.com/w/cpp/container/vector/push_back
여길 보시면...
"If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated."
v에 push_back 할 때마다 현재 capacity가 부족하기 때문에 새로운 메모리 영역을 할당해야 합니다.
이때 iterator가 무효화되어서 더이상 사용할 수 없고요.
문제를 해결하시려면 새로운 vector instance를 만들어서 거기에 push_back하거나, for loop 시작전에 미리 v의 capacity를 충분히 크게 잡아야 하겠습니다.
정정합니다.
메모리 재할당이 매번 일어나지는 않을테니 push_back 할 때마다는 아니겠군요;;
벡터의 capacity를 10000으로 주고 했는데도 안되네요ㅠㅠ
왜 안될까요...
...이게 될리가 없죠
벡터를 처음부터 "끝"까지 훑으면서 계속 같은 벡터에 뭘 넣고 있지 않습니까?
그러면 그 벡터의 "끝"은 어떻게 될까요?
* 잘 이해가 안가면 for loop 한바퀴 돌 때마다 벡터의 내용을 전부 출력해 보세요.
하고 싶으신게 무엇인가요? 계속 push_back하면
하고 싶으신게 무엇인가요? 계속 push_back하면 벡터가 점점 커지는데, 결국 이 코드가 의미하는 건 무한루프입니다. 이 코드가 제대로 돌던 안돌던 간에요.
특정 문자열이 주어지면 그 문자열의 순열을 모두 찾고 싶어요~
예를 들어서 "ABC"라는 문자열이 주어지면 ABC ACB BAC BCA CAB CBA와 같이 문자열로 구성할 수 있는 순열을 찾고 싶은데
그걸 재귀적으로 풀려다가 이렇게 꼬여버렸네요ㅠㅠ
STL은 잘 모르지만 테스트 해보니 돌아가서
STL은 잘 모르지만 테스트 해보니 돌아가서 올려봅니다. C++ 11에서 auto 키워드 의미가 달려졌군요~ 뭔가 했습니다
재귀호출 버전(코드는 효율적이진 않습니다)
STL의 next_permutation 이용버젼
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
댓글 달기