2010-12-01 2 views
-1

char 배열의 큐를 구현, 그래서 나는이 같은 정의하는 방법 : 다음 다음내가 버퍼로 사용하는 STL의 컨테이너를 사용하려는

typedef queue<char*> CHARQUEUE; 

CHARQUEUE p; 

p.push("mouse"); 
p.push("horse"); 

는하지만 내가 원하는 것은 데이터를 보유하기 위해 256 바이트의 char 배열의 큐입니다 : 내가 어떤 작업을 좋아했다. 다음과 같이 정의 할 수 있습니까?

typedef unsigned char newtype[256] 
queue<newtype> newqueue; 

변경하고 싶지 않은 데이터를 보관하기 위해 부호없는 char을 사용하고 있습니다. 그냥 버퍼에 넣고 다시 검색하십시오.

그렇지 않으면 누구든지 다른 구현이 있으면 감사 할 것입니다.

+3

왜 그렇게하고 싶은지 잘 모르겠지만'queue '또는'queue '이 더 적절할 수도 있습니다. – ereOn

+0

_ "변경하고 싶지 않은 데이터를 보유하기 위해 부호없는 char을 사용하고 있습니다."_ const를 사용 했습니까? – Melebius

답변

1

배열은 stdlib 컨테이너 (할당 가능 등)의 요구 사항을 충족하지 않습니다. 부스트의 배열 유형 (또는 tr1/C++ 1x에서 하나).

+0

실제로는 배열이 아니라 포인터가 있습니다. 그리고 포인터는 확실히 요구 사항을 충족시켜야합니다. –

+0

@etarion 예입니다. 그리고 배열을 유지하면서 배열을 유지하는 방법을 찾으면 어디에서나 upvote를 줄 것입니다.배열은 모든 함수 또는 메서드 호출에서 포인터로 감쇠하므로 항상 포인터로 처리됩니다. –

+0

사실, 데이터는 변경 될 수 없습니다 ... 소켓 버퍼에서 수신하고 문자열 버퍼에 저장할 때 ... '\ 0'문자를 추가합니다 ... 나는 "원하지 않는다. – fsidiosidi

1

사용 queue<string> CHARQUEUE;

편집 :

당신은 단지 일부 외부 버퍼에 대한 포인터, 다음 queue<const char*> CHARQUEUE;을 사용하여 저장하지만,이 데이터를 복사하지 않습니다하십시오.

복사본을 만들려면 queue< vector<char> > CHARQUEUE;을 사용하십시오.

+0

사실, 데이터는 변경 될 수 없습니다 ... 소켓 버퍼에서 수신하고 문자열 버퍼에 저장할 때 ... '\ 0'문자를 추가합니다 ... don't는 그것을 원한다 – fsidiosidi

+0

@fsidiosidi 나는 나의 대답을 편집했다. –

+0

@fsidiosidi - true이지만'string'의'size()'는 0 바이트를 포함하지 않습니다. 데이터 복사를 피하려고합니까? –

2

사용

std::queue<std::string> 

편집 :

어떤 대안이.

std::queue<std::vector<char>> 
std::queue<std::array<char, 256>> 
+0

사실, 데이터가 변경되지 않을 것입니다. 왜냐하면 소켓의 버퍼로부터받은 문자열 버퍼에 저장할 때 ... '\ 0'문자를 추가 할 것입니다 ... 그럴 필요가 없습니다. – fsidiosidi

0

당신은 사용할 수 queue<boost::shared_array<const char>> (here 참조)는 내용이 일정 할 경우,이 작업을 수행합니다. 단지 문자열의 대기열에 대한

typedef unsigned char Byte; 
typedef std::vector<Byte> ByteVector; 
typedef std::queue<ByteVector> DataQueue; 

, 다른 사람이 제시 한 std::queue<std::string>이 방법으로

괜찮 정의 원시 데이터 가지의 대기열에 대한

queue<boost::shared_array<const char>> queueArray; 
const char mouse[] = "mouse"; 
boost::shared_array<const char> element(mouse); 
queueArray.push(element); 
3

, ALL_UPPERCASE_NAMES은 최고 매크로 예약

건배 &th.,

+0

exacly Steinbach ... 그래서 : – fsidiosidi

+0

이 때문에 약간의 변환이 필요합니까? ... char 버퍼 [256]; ... DataQueue.push (버퍼); – fsidiosidi

+0

@fsidiosidi : 의존합니다. 아무것도 큐에있는 벡터로 직접 읽는 것을 금지하지 않는다. * 만약 당신이 raw 배열을 가지고 있다면 pushing 위의 typedef를 복사하면 q.push (DataQueue (buffer, buffer + bufSize))). 당신은 아마 그것을 피하기를 원할 것입니다. –

관련 문제