2012-03-13 5 views
3

std::vector을 for 루프 내에서 재사용하고 싶습니다. 그러나 for 루프의 각 반복 단계마다 벡터가 비어 있어야합니다.크기를 변경하지 않고 표준 : 빈 벡터를 비움

질문 : 질문 : 가장 효율적인 방법으로 용량을 변경하지 않고 벡터를 빠르게 비울 수 있습니까? 내가 사용하는 어떤

지금까지

std::vector<int> myVec; 
for(int i=0; i<A_BIG_NUMBER; ++i) { 
    std::vector<T>().swap(myVec); 
    myVec.reserve(STANDARD_MAXIMUM); 

    /// .. doing business 
} 

건배입니다!

해결 방법 : 답변

덕분에, 여기 내가 구현 (확인) 방법은 다음과 같습니다

#include <vector> 
#include <iostream> 

int main() { 

    int n = 10; 
    std::vector<int> myVec; 
    myVec.reserve(n); 
    for(int j=0; j<3; ++j) { 
      myVec.clear(); 
      for(int i=0; i<n; ++i) { 
        myVec.push_back(i); 
      } 
      for(int i=0; i<myVec.size(); ++i) { 
        std::cout << i << ": " << myVec[i] << std::endl; 
      } 
    } 

    return 0; 
} 

편집 :operator[]에서 push_back로 변경되었습니다.

+0

선택한 솔루션이 잘못 될뿐만 아니라 질문이 의미가 없습니다. 벡터의 크기를 일정하게 유지하려면이 벡터의 크기를 지우지 마십시오. 기존 요소의 맨 위에 쓰거나 각 요소를 개별적으로 재설정 할 수 있습니다. –

+0

@BoPersson : 그래, 속았다. 너무 많은 것을 원해 .. 내 질문에서 그걸 잘라 버릴거야. – ezdazuzena

+0

'algorithm' 라이브러리에서'remove'를 찾고 계셨습니까? –

답변

8

vector::clear 방법을 사용하십시오. 용량을 줄이지 않고 내용을 지 웁니다.

+0

고마워, 그 일을하고있어! +1 – ezdazuzena

+1

그러나 크기를 줄이면 위의'myVec [i] = i; '가 위와 같지 않게됩니다. –

+0

예, 동의합니다 .. @ ezdazuzena : 제안대로'push_back'을 사용해야합니다 .. – Asha

4
myVec.clear(); 

이것은 myVec.erase(myVec.begin(), myVec.end())과 동일합니다. 아래

2

사용 명확한 방법 :

std::vector<int> myVec; 
    for(int i=0; i<A_BIG_NUMBER; ++i) 
    { 
     std::vector<T>().swap(myVec); 
     myVec.reserve(STANDARD_MAXIMUM); 

     /// .. doing business 
    myVec.clear(); 
    } 
+2

글쎄,이 경우에는 아마 그의 스왑/리버스 것은 필요하지 않습니다, 그는 무엇입니까? –

+0

내 실수를 사과합니다 ... – shofee

0

대답 OP의 솔루션을 기반으로 :
컨테이너에 대한 일반적인 접근 방식은 빈 컨테이너로 시작하고 표준에 대한 예외와 함께 필요에 따라 그것을 채우는 것입니다 :: 벡터 공간을 예약 할 수있는 위치 벡터 컨테이너에는 개체가 아직 없습니다.
"빈 컨테이너"가 배열처럼 액세스 할 수있는 기본 객체의 컨테이너가 될 수있는 다른 접근 방식을 원한다면 (std :: vector 및 std :: deque에서만 작동 함) resize로 시작해야합니다() 및 채우기 "정리"할 수 있습니다

int n = 10; 
std::vector<int> myVec; 
myVec.resize(n); 
myVec[4] = 5; 
std::cout << myVec[4] << "\n"; 
std::fill(myVec.begin(), myVec.end(), int()); // ofcourse for int, you can use 0 instead of int() 
std::cout << myVec[4] << "\n"; 
0

그 내용에 대한 디폴트 값을 벡터의 현재 크기를 유지하려면, 당신은 벡터에 기본값을 할당 할 수 있습니다. int 벡터의 경우 다음을 수행 할 수 있습니다.

myVec.assign(myVec.size(), 0); 
관련 문제