2017-12-14 5 views
1
#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <time.h> 
#include <iomanip> 

using namespace std; 

bool isOdd(int n) 
{ 
    cout << "HELLO"; 
    bool val = ((n%2) == 1); 
    cout << val << endl; 
    return val; 
} 

int main() 
{ 
    srand(time(NULL)); 

    vector<int> myVec; 
    myVec.reserve(20); 

    for(int i = 0; i < 20; i++) 
    { 
     myVec[i] = rand() % 100; 
     cout << myVec[i] << " "; 
    } 

    vector<int>::iterator q = std::find_if(myVec.begin(), myVec.end(), isOdd); 

    cout << setw(3) << "first odd = " << *q << endl; 

} 

위의 프로그램은 항상 벡터의 첫 번째 숫자를 출력하고 isOdd 함수는 사용하지 않습니다. 나는에서라도 usinf 오전 g++ odd.cppfind_if 항상 첫 번째 요소를 제공하고 isOdd 함수에 들어 가지 않음

를 사용하여 프로그램을 컴파일하는 것은

+3

가 오'myVec'가 비어있다! 아마도'reserve' 대신에'resize'를 쓰려고했을 것입니다. – Rakete1111

+1

또는'myVec.emplace_back (rand() % 100);'. –

+0

벡터가 비어 있지 않습니다. 벡터 요소를 인쇄하고 있습니다. –

답변

7

문제는이 라인에 도와주세요 : (20 개) 요소에 대한

vector<int> myVec; 
myVec.reserve(20); 

std::vector::reserve() 메모리를 예약하지만 벡터의 크기를 변경하지 않습니다. std::vector::operator[]을 통해 해당 요소에 액세스하는 것은 "작동"하는 것으로 보이지만 범위를 벗어난 요소에 액세스 할 때 UB로 연결됩니다. 색인을 확인하는 std::vector::at()으로 바꿀 수 있는지 확인할 수 있습니다. 간단히

에 의해 그 2 개 라인을 교체 :

vector<int> myVec(20); 

0

주와 같은 20 개 요소와 벡터를 만들 것이다 : 당신의 루프는 매직 넘버를 사용하지 말아야과 같이 작성해야합니다

for(size_t i = 0; i < myVec.size(); i++) 

제대로 쓰면 즉시 문제를 알 수 있습니다.

주 2 : 반복자의 유효성을 검사해야하므로 아무런 홀수가 없으므로 역 참조하기 전에 std::find_if에 의해 반환됩니다.

0

reserve에 필요한 메모리가 할당되어 있고 operator[]이 인덱스 범위를 확인하지 않아 충돌하지 않았습니다. 코드에서

항상 myVec.end()std::find_if 반환, 당신이 사용했던 때 이후 벡터의 reserved 크기는 항상 0과 myVec.begin() == myVec.end()입니다.

end() 인 이터레이터를 참조하므로 정의되지 않은 동작이지만 대부분의 STL 라이브러리는 "첫 번째"값이있는 예약 된 메모리의 시작 부분을 핑합니다.

따라서 by changingreserveresize 또는 다른 답변과 동일하게 수정하십시오.

완전히는 다음과 같이한다 코드를 해결하려면, 당신은 push_back을 사용할 수 있습니다

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <time.h> 
#include <iomanip> 

using namespace std; 

bool isOdd(int n) 
{ 
    cout << "HELLO"; 
    bool val = ((n%2) == 1); 
    cout << val << endl; 
    return val; 
} 

int main() 
{ 
    srand(time(NULL)); 

    vector<int> myVec(20); 

    for(int i = 0; i < myVec.size(); i++) 
    { 
     myVec[i] = rand() % 100; 
     cout << myVec[i] << " "; 
    } 

    vector<int>::iterator q = std::find_if(myVec.begin(), myVec.end(), isOdd); 

    if (q != myVec.end()) { 
     cout << setw(3) << "first odd = " << *q << endl; 
    } else { 
     cout << "Odd values not found!!!\n"; 
     return 1; 
    } 
    return 0; 
} 
0

. Push_back 이후

vector<int> myVec; 

      for(int i = 0; i < 20; i++) 
      { 
       myVec.push_back(rand() % 100); 
       cout << myVec[i] << " "; 
      } 

하나씩마다 벡터의 크기를 증가 최종 크기는 20

+0

이것이 좋은 답변을 얻는 동안 이유를 설명해야합니다. – NathanOliver

관련 문제