2010-12-16 3 views
4

"컴퓨터 과학자처럼 생각하는 법"에서 몇 가지 코드 예제를 작성하고 있습니다.이 예제는 게임 카드 유형의 객체와 데크를 처리하는 방법입니다.size_t와 비교하여 int를 반환 하시겠습니까?

int Card::find(const std::vector<Card>& deck) const { 
    size_t deckSize = deck.size(); 
    for (size_t i=0; i<deckSize; i++) 
     if (equals(*this, deck[i])) return i; 

    return -1; 
} 

내가 (텍스트와 같이 비주얼 스튜디오 2010의 C++에서 벡터의 ".length()"를 사용하고, 대신 크기는을 사용했다 없습니다) 반환 :이 상황에 직면하고있어 (나는) std :: size_type을 믿는다. 나는 size_t를 사용하고 다른 아키텍쳐에서 문제를 피하기 위해 내가 읽었을 때와 같이 생각했다. 그러나 내가 i을 돌려 주는지 궁금해하는데, 정수보다 크다면, 나는 프로그램을 충돌시킬 것인가?

일단 카드보다 큰 것을 벡터로 사용하기 시작하면 컴파일러 불일치 경고로 인해 부호없는 int를 사용하는 것이 고려되었지만 서명되지 않은 int 또는 int를 반환한다고 느낍니다. 몇 가지 문제 : 1) int는 충분히 큰 벡터 인덱스를 사용하지 않습니다. 2) unsigned int를 반환하면 -1을 반환하지 않습니다. 3) unsigned int는 모든 아키텍처에서 size_t와 같지 않습니다 (ARM Cortex-M3에서 마이크로 컨트롤러 프로그래밍을하고 있습니다).

벡터가 충분히 큰 경우 어떻게해야합니까?

+9

당신은 다른 C++ 책을 받고 고려해야를 사용할 수 있다면. [훌륭한 C++ 입문서] 목록이 있습니다 (http://stackoverflow.com/questions/388242/the-definitive-c++book-guide-and-list). 저는 C++에서 컴퓨터 과학자처럼 생각하는 법에 익숙하지 않지만 첫 번째 예제는'void main()'을 가지고 있고' '을 사용합니다. 그것은 유망 해 보이지 않습니다. –

답변

3

캐스팅은 size_t에서 int까지 프로그램을 "충돌"시키지 않지만 나쁜 실행입니다. 다른 한편, STL은 당신이하고있는 것에 대해 좋은 find 알고리즘을 포함합니다.

+0

마이크로 컨트롤러 (특히 ARM Cortex-M3) 용으로 작성할 수 있기 때문에 비 PC 프로그래밍을 위해 STL을 사용하는 것에 대해서도 신경을 써야합니다. 부적절하게 처리 한 경우 STL에 코드 크기를 표시하는 기능이있는 것으로 보입니다. – darvelo

+1

많은 사람들이 고함을 치기 시작할 지 모르지만, 이런 종류의 일을하기 위해서 C를 고수하고 싶을 수도 있습니다 :) –

0

size_t은 일반적으로 unsigned int이지만 그 것에 의존 할 수 없습니다. int보다 큰 경우 충돌이 발생하지 않고 (아마 음수) 숫자로 넘어갑니다.

하나의 벡터에 수만 장의 카드가없는 것으로 가정하면 int을 돌려 주면 기쁩니다.

+2

size_t는 64 비트 플랫폼에서 부호없는 int가 아닐 수도 있습니다. –

+0

정확히. 그것이 당신이 그 것에 의지 할 수없는 이유입니다. – Robert

2

int는 32 비트/64 비트 Windows 및 Linux에서 32 비트입니다. 31 일에 2보다 큰 경우 저는 잘립니다. 부호없는 int를 사용할 수 있고 벡터에 4G 이상의 요소를 저장하지 않으면 프로그램이 정상적으로 작동합니다.

+0

제안에 감사드립니다. 결과가 반환되지 않는 경우에 대비하여 -1을 반환하려는 경우 unsigned int가 처리하지 못합니다. 나는 그것을 반영하기 위해 내 게시물을 수정합니다. – darvelo

0

또한 std::map insert()과 비슷한 std::pair<size_t, bool>을 반환 할 수 있습니다. 두 번째 템플릿 인수는 성공 또는 실패를 의미합니다.

당신은 확인이와 함께, 당신은 또한 boost::optional

관련 문제