|
만해 님이 쓰신 글 :
: 안녕하세요 만해 입니다.
:
: 제가 하고 있는 암호화를 위해서 비트 어래이가 필요해서요
:
: 막뒤지던중
:
: STL의 BVetcor이란게 있어서 한번 테스트 해볼려고 하는데요
:
: 빌더의 헬프에 있는걸 그래도 적어 놓고 하는건데요
:
: 이게 for문에서 바로 에러가 나네요
:
: 뭐가 잘 못 된건지 좀 알려 주세요~
:
: 흑흑
:
: 결국 bit Array는 포기 해야 하는건가 흑~
#pragma hdrstop 위치가 틀렸습니다.
STL은 Standard "Template Library",
즉 헤더파일로만 이루어진 라이브러리(lib이나 dll 같은 것이 없습니다.)입니다.
(당근, 오픈소스일 수 밖에는 없죠. ^^;)
즉, 모든 코드가 컴파일 타임에 매번 새로 생성되는 구조입니다.
그러므로 헤더파일을 precompiled header로 놓을 수 없습니다.
STL의 몇 개 안되는 단점중 하나를 들자면 컴파일 타임이 오래걸린다는 거죠.
다른 헤더 파일을 먼저 인클루드 하신 후,
#pragma hdrstop 을 놓고, 그 다음에 STL 헤더파일들을 인클루드하셔야 합니다.
저도 처음엔 이걸 몰라서 한참 고생하다 알아냈습니다.
//#include <vcl.h> <- 이건 지금 필요 없겠죠?
//#include <conio.h> <- 이것도...
#pragma hdrstop // 여기다 선언해야 합니다.
: #include <iostream>
: #include <vector>
//#include "stl/_bvector.h" <- 이것도 필요없습니다.
//#pragma hdrstop <- 틀림!
using namespace std; // 이건 반드시 필요합니다!
: //---------------------------------------------------------------------------
: #pragma argsused
: int main(int argc, char* argv[])
: {
: bit_vector V(5);
: V[0] = true;
: V[1] = false;
: V[2] = false;
: V[3] = true;
: V[4] = false;
:
: for (bit_vector::iterator i = V.begin(); i < V.end(); ++i)
: cout << (*i ? '1' : '0'); // <- 여기서 처음부터 바로 에러가 나네요
: cout << endl;
:
: //getch();
: return 0; // 저는 getch() 대신에 이 위치에 브레이크 포인트를 잡는 방법을 애용합니다.
: }
여기서 bit_vector란 것은 vector<bool>을 typedef한 겁니다.
그런데 이 vector<bool>에는 심각한 단점이 있기 때문에 절대 쓰지 마시고,
대신 bitset이나 deque<bool>을 쓰실 것을 강력히 권합니다.
bitset은 STL 컨테이너는 아니지만(그래서 STL 책에는 설명이 빠져 있습니다.)
ANSI C++ 라이브러리에는 속해 있습니다.
STL 컨테이너가 아니기 때문에 크기 변경이나 반복자, 알고리듬 등을 지원하지 않지만
비트 조작에 매우 편리한 멤버 함수들을 제공하는 장점이 있습니다.
만약, STL 컨테이너로서의 성질을 써야 한다면
deque<bool>을 쓰시면 되고요.
자세한 내용은 Effective STL(번역판 나온 건 아시죠?) 항목 18에 나와있습니다.
다음은 빌더6 STLport 헬프에 있는 예제 코드입니다. 참고하시길...
const bitset<12> mask(2730ul);
cout << "mask = " << mask << endl;
bitset<12> x;
cout << "Enter a 12-bit bitset in binary: " << flush;
if (cin >> x) {
cout << "x = " << x << endl;
cout << "As ulong: " << x.to_ulong() << endl;
cout << "And with mask: " << (x & mask) << endl;
cout << "Or with mask: " << (x | mask) << endl;
}
|