2014-01-28 2 views
1

std :: array 대신 std :: vector를 사용하는 데 한 가지 문제가 있습니다. 대부분의 사람들은 메모리 할당 방법 (배열은 메모리를 정적으로 할당하고 벡터는 메모리를 동적으로 할당 함)을 제외하고 같은 목적으로 사용한다고 말합니다. 내 이해를 분명히하기 위해 나는 무언가를 시도했지만 실패했다.프로그래밍에서 사용할 배열과 벡터 차이점

배열을 사용하여 코드를 실행하고 있었지만 정상적으로 작동했습니다.

char userInput[MAX_DATA] = { '\0' }; 
std::cout<<"\enter some char: "; 
std::cin.getline(userInput, MAX_DATA); 
int bytes_sent = send(socketFD, userInput, strlen(userInput), 0); 
//send function definition send(__in SOCKET s, __in_bcount(len) const char FAR * buf, __in int len, __in int flags); 

벡터를 사용하여 I에 의해 대신에 정의 된 코드 위에 내 코드 라인을 변경 :

std::vector<char> userbuffer; 
std::cout<<"\enter some char: "; 
cin>>input;// i only want to send only the data i entered here in run time. 
int bytes_sent = send(socketFD, userbuffer, userbuffer.size(), 0); 
//error C2664: 'send' : cannot convert parameter 2 from 'std::vector<_Ty>' to 'const char* ' 

전 C++의 STL의 개념에 정말 새로운입니다. 누군가 내가 뭘 잘못하고 있는지 찾아 낼 수있게 도와 줄 수 있습니까? 내 의도는 동적 메모리 할당을 보는 것입니다.

답변

4

std::vector는 동적 크기 조정 어레이를 캡슐화 (I는 2 send_to는 매개 변수의 char* 소요 가정).

userbuffer.data() 

이 때문에 작동을 보장 : 멤버 함수 data를 호출하여, C++ (11) 이후,

&userbuffer[0] 

나 : 당신은 첫 번째 요소의 요소 유형 복용 주소에 대한 포인터를 얻을 수 있습니다 내부 배열은 연속적으로 저장됩니다.

0

이 경우 std :: vector 대신 class std :: string을 사용하는 것이 더 좋습니다. std::vector<char>에 입력 에는 operator>> 없다 : 당신은 함수를 호출 멤버 함수 c_str()는 상기 제록 것 외에도

2

에 형 표준의 객체 : 문자열을 전달할 수 있습니다. 당신 원래 쓴 가장 가까운 와서 :

std::string userInput; 
std::cout << "enter some char: "; 
if (!std::getline(std::cin, userInput)) { 
    // Error... 
} 
int bytesSent = send(socketFG, userInput.data(), userInput.size(), 0); 

(당신이 잘 같은 초기 버전에서 오류를 확인하기 위해 잊어 버렸습니다.)

+0

당신을 감사합니다! 그 때문에 런타임 오류가 발생했으나 다음과 같이 수정했습니다. – User

+0

그리고 첫 번째 버전에서는 if (std :: cin.fail())을 사용 했으므로 문제가 없었습니다. 두 번째 버전에서는 문제가있었습니다. – User

관련 문제