2013-09-06 2 views
0

벡터 삭제 기능에 이상이 있습니다. 내가하고 싶은 것은 벡터의 첫 번째 요소를 지우는 것입니다.벡터 삭제 기능이 작동하지 않습니다. C++

여기에 세부 사항이 있습니다. 나는 cv라는 객체 포인터를 만들었습니다. 이 객체 포인터의 클래스 내에 v라는 정수형 벡터가 있습니다.이 포인터에는 숫자 목록이 있습니다.

이 개체 포인터는 컨베이어 벨트의 영향을 복제하기위한 것입니다. 제가하고 싶은 일 중 하나는 벨트를 앞으로 움직이는 것입니다. 이것은 벡터의 관점에서 최상위 위치의 번호를 삭제한다는 의미입니다.

이렇게하려면 벨트를 앞으로 옮기는 방법에 v.erase(v.begin())이라고 적었습니다. 하지만 이걸 실행하면 작동하지 않습니다. 나는 끊임없이 같은 아이템을보고있는 무한 루프에 빠져 들었다.

그런 다음 v.erase(0)을 시도했지만 여전히 작동하지 않았습니다. 범위에서 삭제를 시도했지만 작동하지 않을 수도 있습니다. 이상한 점은 문제없이 벡터에 추가 할 수있을뿐만 아니라 그 안에있는 항목을 찾을 수 있다는 것입니다. 나는 삭제할 수 없습니다. 어떤 도움을 주셔서 감사합니다. 제게 더 많은 정보가 필요하면 알려주세요. 내가 벡터에 항목을 추가 편의의 위해, 내가 파일에서 데이터를 읽어 생성자를 포함하지했습니다

class Belt() 
{ 
vector<int> v; 
public: 
void MoveBelt(); 
}; 

void Belt::MoveBelt() 
{ 
    v.erase(v.begin()); 
} 

int main() 
{ 
    char filename[256]; 
    Belt *cc = new Belt(filename); 

    if(condition met) 
    { 
     cc->MoveBelt(); 
    } 
} 

, 나 방법 : 여기

는 몇 가지 관련 코드 . 좀 더 살펴보고 다른 것이 필요한지 알려주십시오.

+5

한 줄의 코드는 100 단어의 가치가 있습니다. 자기 만의 작은 예제를 보여 준다면 누군가는 설명을 읽는 것보다 훨씬 빨리 잘못된 것을 발견 할 수 있어야합니다. – dasblinkenlight

+1

"작동하지 않았습니다"는별로 유용하지 않습니다. 몇 가지 코드를 보여줄 수 있습니까? 또한 컨베이어 벨트를 원한다면 벡터 대신에'std :: list'를 고려해 보셨습니까? – Jon

+0

설명하는 효과를 보여주기 위해 실제 코드를 표시 할 수 있습니까? 예를 들어'v'를 값 매개 변수로 사용하는 함수에서 요소를 지우는 ('void'() :: vector v) {v.erase (v); }'. –

답변

0

다음은 v.erase(v.begin()); 실제로 인 것을 보여주는 완전한 예입니다. 그것을 바탕으로 나는 당신이 병이 났음을 짐작할 것입니다. BTW, 왜 정확히 힙에 개체를 할당하고 있습니까? 그렇게 할 필요가없는 것 같습니다.

#include <algorithm> 
#include <initializer_list> 
#include <iostream> 
#include <iterator> 
#include <vector> 

class Belt 
{ 
    std::vector<int> v; 
public: 
    Belt(std::initializer_list<int> list): v(list.begin(), list.end()) {} 
    bool empty() const { return v.empty(); } 
    std::vector<int>::const_iterator begin() const { return v.begin(); } 
    std::vector<int>::const_iterator end() const { return v.end(); } 
    void MoveBelt(); 
}; 

std::ostream& operator<< (std::ostream& out, Belt const& belt) 
{ 
    std::copy(belt.begin(), belt.end(), 
       std::ostream_iterator<int>(std::cout << '[', " ")); 
    return out << ']'; 
} 

void Belt::MoveBelt() 
{ 
    v.erase(v.begin()); 
} 

int main() 
{ 
    Belt cc{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    while (!cc.empty()) { 
     std::cout << cc << "\n"; 
     cc.MoveBelt(); 
    } 
} 
+0

안녕 Dietmar, 귀하의 회신에 감사드립니다. 벡터 구조를 포함한 스켈 레탈 코드는 강사가 제공했습니다. v.erase (v.begin())를 int main (클래스의 멤버 함수가 아닌) 내에서 테스트했을 때 잘 작동했습니다.통화가 시작되지 않기 전에 상황이 옳을 수도 있습니다. 도와 줘서 고마워. –

관련 문제