string의 c_str함수같은게 벡터에는 없는건가요?

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
aser0070
Posts: 103
Joined: 2001-10-15 09:00
Location: if

string의 c_str함수같은게 벡터에는 없는건가요?

Post by aser0070 »

문자열의 경우에는,,,

Code: Select all

    string str = "hello world";
    const char* s = str.c_str();
인데,, 벡터의 경우 비슷하게 쓰는 방법이 있나여?

Code: Select all

    vector<int> intVect;
    const int* array = intVect.????();
    // const int* array = &(intVect[0]);
    // const int* array = &(*intVect.begin());
    // const int* array = array( intVect );    <- 그냥 이런게 있지 않을까 하구 생각해본것..
간만에 다시 stl쓰려니.. 가물가물하군요..
uhmgoon
Posts: 96
Joined: 2008-01-29 14:21

Post by uhmgoon »

그냥 첫번째, 두번째 방법으로 하시면 되는데요...
aser0070
Posts: 103
Joined: 2001-10-15 09:00
Location: if

Post by aser0070 »

front함수로 쓰는게 그나마 가장 근접한것 같은데요.

const int* array = &(intVect.front());
비회원

...

Post by 비회원 »

stl를 포함해 대체적으로 백터 구현이 선형적이지만...
표준은 아니라구 알고 있습니다.
코드가 조금 위험하지는 않을까용?
비회원

Re: ...

Post by 비회원 »

비회원 wrote:stl를 포함해 대체적으로 백터 구현이 선형적이지만...
표준은 아니라구 알고 있습니다.
코드가 조금 위험하지는 않을까용?
메모리배치 구현이 선형적인게 표준이라고 Effective STL에서 말한걸 본거 같습니다

제 기억이 맞다면 , 표준에서 명시하길 vector는 연속된 메모리 공간을 사용한다고 본거 같네요
ohyecloudy
Posts: 14
Joined: 2005-07-21 11:44
Contact:

찾아봤는데 없는 것 같습니다.

Post by ohyecloudy »

비회원 wrote:제 기억이 맞다면 , 표준에서 명시하길 vector는 연속된 메모리 공간을 사용한다고 본거 같네요
C++ Standard ISO/IEC 14882에서 찾아봤는데, 보이지 않네요. 제가 제대로 살펴보지 못한 결과일 수도 있다고 생각합니다.

만약 관련 내용을 보셨다면 자세한 페이지와 구절을 가르쳐 주실 수 있을런지요

PS : 링크 삭제했습니다.
Last edited by ohyecloudy on 2008-01-29 20:32, edited 1 time in total.
Programming( I.dream ) ;
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

ohyecloudy님 ISO/IEC 14882 링크 삭제해 주세요~ (ISO 14882는 ISO에서 유료로 판매하는 문서입니다.)
류광
Posts: 3805
Joined: 2001-07-25 09:00
Location: GPGstudy
Contact:

Post by 류광 »

최신 표준 초안이 다음 주소에 있습니다.

http://www.open-std.org/jtc1/sc22/wg21/ ... /n2461.pdf

벡터의 연속성에 대한 문구는 98 버전에는 없고요. 위의 초안을 보면 다음과 같은 문구가 있습니다(23.2.5 p1).

v가 vector<bool>이 아닌 vector일 때
모든 0 <= n < v.size()에 대해 &v[n] == &v[0] + n

이 사항은 C++03(14882:2003)부터 들어간 것으로 알고 있습니다. 아마 최근 컴파일러들은 이 사항을 지키고 있을 것입니다...
비회원

Post by 비회원 »

류광 wrote:최신 표준 초안이 다음 주소에 있습니다.

http://www.open-std.org/jtc1/sc22/wg21/ ... /n2461.pdf

벡터의 연속성에 대한 문구는 98 버전에는 없고요. 위의 초안을 보면 다음과 같은 문구가 있습니다(23.2.5 p1).

v가 vector<bool>이 아닌 vector일 때
모든 0 <= n < v.size()에 대해 &v[n] == &v[0] + n

이 사항은 C++03(14882:2003)부터 들어간 것으로 알고 있습니다. 아마 최근 컴파일러들은 이 사항을 지키고 있을 것입니다...
effective stl 에서 보길 , 아마 98버전엔 빠졌더라도 벤더들간의 산업표준으로 백터구현을 배열방식으로
정해졌다고 본거 같습니다 .....

effective stl 책이 2003년이전에 나온걸 보면, 믿을만한 근거로 스캇마이어가 이야기 했을거라 생각됩니다

한마디로 안심하고 vector가 연속된 메모리상에 구현되었다고 생각하고 플밍하라고 하는데요

책이 지금 없어서 정확히는 말씀드리기 어려우나 Effective STL 의 C의 배열과 호환되는 백터부분을

찾아보시면 그에 관이야기가 있을겁니다
herzz
Posts: 24
Joined: 2005-08-04 17:32

Re: string의 c_str함수같은게 벡터에는 없는건가요?

Post by herzz »

아마 이미 알고 계실 듯하지만, 주의하셔야 합니다.

원소를 가지고 있지 않은 경우에 적절하지 않은 메모리 액세스를 시도 할 우려가 있습니다.
컨테이너가 비어 있는지 항상 검사를 해야 하는 부담이 있죠.

Code: Select all

if( !intVect.empty() )
  array = &(intVect[0]);
&(*intVect.begin()) 혹은 &(intVect.front())인 경우도 같은 결과를 얻기 때문에, 역시 문제가 있겠죠.

또 한 가지 문제는, capacity를 초과하거나 해서 재할당이 일어나는 경우, 저렇게 얻어 온 포인터가 더 이상 유효하지 않게 되는 문제가 있겠네요.

Code: Select all

if( intVect.size() < intVect.capacity() )
{
  ...
}
포인터를 어딘가로 전달한 후에 컨테이너에 원소를 추가하는 경우에는 capacity를 넘어가는지를 신경 써야 하겠고, 적절한 크기로 reserve 할 필요도 있다고 생각하면, 배열을 사용하는 데 비해 vector를 배열처럼 이용하는 것이 별로 매력적인 것 같진 않네요.
aser0070
Posts: 103
Joined: 2001-10-15 09:00
Location: if

Post by aser0070 »

스레드 종료 처리할때 WaitForMultipleObjects에서 사용했습니다.
스레드 클래스가 있고 stl컨테이너를 이용해서 이 스레드 클래스들을 관리하는데,,
프로그램 종료 처리시 스레드를 안전하게 종료후 애플리케이션이 종료되게금하기위해
WaitForMultipleObjects를 사용했는데요. 이 함수가 핸들에대한 배열을 인자로 받네요. (뭔가 시대착오적인 냄새가,,)
그래서 지역적으로 vector를 생성시켜서 처리했습니다.

Code: Select all

    // 스레드클래스
    class Thread
    {
    public:
        HANDLE GetHandle() const { return m_hThread; }
    private:
        HANDLE m_hThread;
    };
    
    void XXX::Destroy()
    {
        using namespace std;
        
        vector<HANDLE> waitList;
        {
            ScopedLock<CSLock> unnamed( m_ThreadListLock ); // 스레드 동기화
        
            waitList.reserve( m_ThreadList.size() );
            transform( m_ThreadList.begin(), m_ThreadList.end(), back_inserter(waitList), mem_fun(&Thread::GetHandle) );
        
            DWORD waitRes = WaitForMultipleObjects( (DWORD)waitList.size(), &(waitList.front()), TRUE, 5000 ); // <- 요기서 사용했음.
        
        // ...
        // 종료처리
        // ...
        }
    }
비로서 느끼는건데,,
stl의 알고리즘쪽은 한가지 작업을 한라인에 표현하려는 의도가 강한것 같습니다.
뭐, 함수 단위니 당연한 말이겠지만요,,

막 쓰기에는 뭔가 위험한 요소들이 분명 있기는 하지만은,,
코드를 읽는 입장을 생각해보면, 가장 이상적인 형태인것 같습니다.
(복잡한 사정은 숨기고, 의미만 표현되니까요.)
kim05005
Posts: 235
Joined: 2007-03-24 13:23
Location: namespace std
Contact:

Post by kim05005 »

vector가 비록 배열 형태로 구현되기는 하지만, 먼저 할당 되어 있는 배열이 꽉차면 그 다음 메모리 공간을 할당합니다. 운이 좋으면 바로 그 다음 메모리 공간을 할당 받을 수 있겠지만, 반드시 그러리란 보장이 없습니다..

물론 객체 수가 적을 경우에는 괜찮을지 몰라도, 충분히 많아진다면 위험해질 수 있습니다.

아예 생성할 때부터 객체의 수를 지정해주어야 그래도 비교적 안전합니다.
지금도 콜라 좋아해요!
비회원

무슨 말씀이신지..

Post by 비회원 »

kim05005 wrote:vector가 비록 배열 형태로 구현되기는 하지만, 먼저 할당 되어 있는 배열이 꽉차면 그 다음 메모리 공간을 할당합니다. 운이 좋으면 바로 그 다음 메모리 공간을 할당 받을 수 있겠지만, 반드시 그러리란 보장이 없습니다..

물론 객체 수가 적을 경우에는 괜찮을지 몰라도, 충분히 많아진다면 위험해질 수 있습니다.

아예 생성할 때부터 객체의 수를 지정해주어야 그래도 비교적 안전합니다.
.. 배열이 꽉차면 다음 메모리 공간을 할당하는게 아니라

보통 ( 구현마다 다르지만 ), 현재 배열 크기의 2배를 할당 받아

모든 데이터들을 복사합니다.

따라서 여전히 선형은 보장됩니다.

그래서 많은 데이터를 삽입할 때, reserve 등으로 확보해놓지 않고 삽입하면

반복적인 복사가 발생하죠.
kim05005
Posts: 235
Joined: 2007-03-24 13:23
Location: namespace std
Contact:

Re: 무슨 말씀이신지..

Post by kim05005 »

비회원 wrote:
kim05005 wrote:vector가 비록 배열 형태로 구현되기는 하지만, 먼저 할당 되어 있는 배열이 꽉차면 그 다음 메모리 공간을 할당합니다. 운이 좋으면 바로 그 다음 메모리 공간을 할당 받을 수 있겠지만, 반드시 그러리란 보장이 없습니다..

물론 객체 수가 적을 경우에는 괜찮을지 몰라도, 충분히 많아진다면 위험해질 수 있습니다.

아예 생성할 때부터 객체의 수를 지정해주어야 그래도 비교적 안전합니다.
.. 배열이 꽉차면 다음 메모리 공간을 할당하는게 아니라

보통 ( 구현마다 다르지만 ), 현재 배열 크기의 2배를 할당 받아

모든 데이터들을 복사합니다.

따라서 여전히 선형은 보장됩니다.

그래서 많은 데이터를 삽입할 때, reserve 등으로 확보해놓지 않고 삽입하면

반복적인 복사가 발생하죠.
아.. 그랬군요. 저도 이걸 어디선가 보고서 올린 글이었는데,

제가 글을 잘못 읽었거나

그 글이 잘못 된 거겠군요...

지적 고맙습니다. :D
지금도 콜라 좋아해요!
Locked