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와 같이 문자열로 구성할 수 있는 순열을 찾고 싶은데
그걸 재귀적으로 풀려다가 이렇게 꼬여버렸네요ㅠㅠ
void getPermutations(vector<string>* v, string str) { if(str.length() <= 1) { v->push_back(str); return; } // 맨 앞의 한 문자를 split하고 나머지 string들은 다시 재귀호출 // 그러니깐 문자열 ABC에서 A를 SPLIT한 BC를 다시 재귀 호출 char firstChar = str.at(0); getPermutations(v, str.substr(1)); // 문제 있는 코드 -- 이걸 어떻게 바꿔야 될까요? for(auto it = v->begin(); it != v->end(); ++it) { string word = (*it); cout << "word: " << word << endl; for(int i = 0; i <= word.length(); ++i) { string newStr = word.substr(0, i) + firstChar + word.substr(i); v->push_back(newStr); } } }STL은 잘 모르지만 테스트 해보니 돌아가서
STL은 잘 모르지만 테스트 해보니 돌아가서 올려봅니다. C++ 11에서 auto 키워드 의미가 달려졌군요~ 뭔가 했습니다
재귀호출 버전(코드는 효율적이진 않습니다)
void getPermutations(vector<string>* v, string str) { if(str.length() <= 1) { v->push_back(str); return; } // 맨 앞의 한 문자를 split하고 나머지 string들은 다시 재귀호출 // 그러니깐 문자열 ABC에서 A를 SPLIT한 BC를 다시 재귀 호출 for(int i = 0; i < str.length(); i++) { char firstChar = str.at(i); string newStr = firstChar + str.substr(0, i) + str.substr(i + 1); getPermutations(v, newStr.substr(1)); for(auto it = v->begin(); it != v->end(); ++it) { if ((*it).length() == str.length() - 1) // 길이가 모자란 놈들만 하향 재귀호출했던 것들이므로 (*it) = firstChar + (*it); } } }STL의 next_permutation 이용버젼
void getPermutations_v2(vector<string>* v, string str) { vector<char> v2; for(auto it = str.begin(); it != str.end(); ++it) { v2.push_back(*it); } do { string perm; for(auto it = v2.begin(); it != v2.end(); ++it) { perm += (*it); } v->push_back(perm); } while(std::next_permutation(v2.begin(), v2.end())); }Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
댓글 달기