programing

std:: vector에서 char* 배열까지

powerit 2023. 9. 20. 20:48
반응형

std:: vector에서 char* 배열까지

저는.std::vector<std::string>내가 사용해야 할 것은C다음을 읽는 함수의 인수char* foo . 변환하는 방법을 보았습니다.std::string로.char*. 신참으로서C++, 벡터의 각 요소에 이 변환을 수행하는 방법을 조합하여 다음을 생성하려고 합니다.char*배열해 놓은

밀접하게 관련된 SO 질문을 여러 번 보았지만, 대부분은 다른 방향으로 이동하여 생성하는 방법을 설명하는 것 같습니다.std::vector<std::string>.

사용가능std::transform다음과 같이:

std::transform(vs.begin(), vs.end(), std::back_inserter(vc), convert);  

당신이 실행해야 하는 것은convert()다음과 같이:

char *convert(const std::string & s)
{
   char *pc = new char[s.size()+1];
   std::strcpy(pc, s.c_str());
   return pc; 
}

테스트 코드:

int main() {
       std::vector<std::string>  vs;
       vs.push_back("std::string");
       vs.push_back("std::vector<std::string>");
       vs.push_back("char*");
       vs.push_back("std::vector<char*>");
       std::vector<char*>  vc;

       std::transform(vs.begin(), vs.end(), std::back_inserter(vc), convert);   

       for ( size_t i = 0 ; i < vc.size() ; i++ )
            std::cout << vc[i] << std::endl;

       for ( size_t i = 0 ; i < vc.size() ; i++ )
            delete [] vc[i];
}

출력:

std::string
std::vector<std::string>
char*
std::vector<char*>

온라인 데모 : http://ideone.com/U6QZ5

사용가능&vc[0]필요한 곳이면 어디든지char**.

참고로 우리가 사용하고 있기 때문에new각각에 메모리를 할당하다std::string(에서)convert함수), 마지막에 메모리를 할당 해제해야 합니다.이를 통해 벡터를 변경할 수 있는 유연성을 얻을 수 있습니다.vs; 할 수 있습니다push_back문자열을 더 추가하고 기존 문자열을 삭제합니다.vs,그리고.vc(즉,vector<char*>여전히 유효합니다!

하지만 이런 유연성을 원하지 않는다면, 이걸 사용해도 됩니다.convert함수:

const char *convert(const std::string & s)
{
   return s.c_str();
}

당신은 변해야 합니다.std::vector<char*>로.std::vector<const char*>.

이제 변신 후에 당신이 변한다면vs새 문자열을 삽입하거나, 이전 문자열을 삭제하여 모든 문자열을 입력합니다.char*인에vc무효가 될 수도 있습니다.그것이 중요한 점입니다.또 다른 중요한 점은, 당신이 사용할 필요가 없다는 것입니다.delete vc[i]더이상 당신의 코드로.

당신이 할 수 있는 최선의 방법은,std::vectorconst char*당신의 벡터와 같은 크기입니다.그런 다음 벡터의 각 요소를 걸으며 호출합니다.c_str()문자열 배열을 가져와 배열의 해당 요소를 저장합니다.그러면 이 벡터의 첫 번째 요소에 대한 포인터를 해당 함수에 전달할 수 있습니다.

코드는 다음과 같습니다.

std::vector<const char *> cStrArray;
cStrArray.reserve(origVector.size());
for(int index = 0; index < origVector.size(); ++index)
{
  cStrArray.push_back(origVector[index].c_str());
}

//NO RESIZING OF origVector!!!!

SomeCFunction(&cStrArray[0], cStrArray.size());

문자열의 원래 벡터를 가져오는 시간 사이에 크기가 조정되도록 허용할 수 없습니다.const char*s부터std::strings, C-function을 호출하는 시간.

작동해야 합니다.

char ** arr = new char*[vec.size()];
for(size_t i = 0; i < vec.size(); i++){
    arr[i] = new char[vec[i].size() + 1];
    strcpy(arr[i], vec[i].c_str());
}

편집:

vec가 여전히 정확한 요소 수를 가지고 있다고 가정할 때 이러한 데이터 구조를 자유롭게 하는 방법은 다음과 같습니다. 만약 C 함수가 이 배열을 어떻게 수정한다면 다른 방법으로 크기를 구해야 할 수도 있습니다.

for(size_t i = 0; i < vec.size(); i++){
    delete [] arr[i];
}
delete [] arr;

다시 편집:

C 함수가 문자열을 수정하지 않으면 문자열을 복사할 필요가 없을 수 있습니다.인터페이스가 어떻게 생겼는지 자세히 설명해 주시면 저희가 더 나은 도움을 드릴 수 있을 것 같습니다.

C++0x의 가 하는std::string연속적으로 보관할 것을 보장합니다.

std::vector<std::string> strings = /* from somewhere */;
int nterms = /* from somewhere */;

// using std::transform is a possibility depending on what you want
// to do with the result of the call
std::for_each(strings.begin(), string.end(), [nterms](std::string& s)
{ ModelInitialize(&s[0], nterms); }

null 에 (s.begin(), s.end())의미가 없을 수도 있습니다.이를 수정하기 위해 후처리할 수 있습니다.

s = std::string(s.begin(), std::find(s.begin(), s.end(), '\0'));

로 입니다.char[]:

typedef std::unique_ptr<char[]> pointer;
std::vector<pointer> args;
std::transform(strings.begin(), strings.end()
               , std::back_inserter(args)
               , [](std::string const& s) -> pointer
{
    pointer p(new char[s.size()]);
    std::copy(s.begin(), s.end(), &p[0]);
    return p;
});

std::for_each(args.begin(), args.end(), [nterms](pointer& p)
{ ModelInitialize(p.get(), nterms); });

const char*는 char*와 동일하며, const_ness에서만 다르며, 당신의 인터페이스 메서드는 const와 non-const 문자열을 모두 받아들입니다.

c_str()은 constchar를 반환하지 않습니까?차만 있으면 문제가 될까요?

예, 고정 문자열을 반환하므로 문제가 없습니다.

const char*a="something";
////whatever it is here
const char* retfunc(const char*a)
{
   char*temp=a;
   //process then return temp
}

로컬 개체를 반환하는 것은 많은 사용자에게 허용되지 않으며 이 작은 예는 그대로 제공됩니다.

벡터의 요소는 연속적으로 저장되므로 가장 좋고 쉬운 방법은 다음과 같습니다.

std::vector<char> v;
char* c = &v[0];

언급URL : https://stackoverflow.com/questions/7048888/stdvectorstdstring-to-char-array

반응형