2009-06-14 4 views

답변

6

당신이 몇 가지 문자열을 반환 다음 중 하나를 사용해야하는 경우 :
- 표준 : : 쌍
- 부스트 :: 튜플
- 당신이 얼마나 많은 문자열을 모르는 경우 구조

함수 것 return - std :: vector와 같은 것을 사용하십시오.

+1

곧 std :: tuple이 될 것이고 boost :: tuple이 아닙니다 :-) – Zifre

4

나는 그랬다면 vector을 초로 반환 할 것입니다. 배열을 사용하면 메모리 관리에 대해 걱정할 필요가 있습니다. 또한 문자열을 수정하고 싶지 않으면 const 참조로 전달할 수 있습니다.

+0

Top Coder 연습 세션에서 얻었습니다. 질문에서 일련의 문자열을 반환하라는 요청을 받았습니다. – abc

1

하드 코어와 도전 과제를 느낀다면 char **를 반환 할 수 있습니다.

그러나 이것은 매우 오류가 발생하기 쉽기 때문에 대신 표준 컨테이너 또는 문자열 클래스를 사용해야합니다.

+0

읽기 http://www.lysator.liu.se/c/c-faq/c-2.html#2-10 – siddhant3s

+0

@ siddhant3s : 그는 메인에있는 argv와 마찬가지로 char **를 의미합니다. NULL 종결자를 사용하십시오. 이것은 일을하는 구식 C 방식입니다. 이 접근법을 C++에서 비추천으로 취급해야하지만 * 잘 작동합니다. – dmckee

0

문자열을 포인터 또는 참조를 통해 "out"매개 변수로 함수에 전달하고 함수 내에서 수정합니다.

1

그들은 (Top Coder) C- 문자열 배열 또는 std :: 문자열 배열을 언급 했습니까? 당신은 여전히 ​​표준 : : 문자열의 배열을 반환 할 경우 내용 는, 배열, 최근 (http://siddhant3s.googlepages.com/how_to_tell_rusted_cpp.htmlhttp://www.parashift.com/c++-faq-lite/containers.html#faq-34.1) 악, 당신은 그러나 당신은 당신이 따라 [] 반환 된 포인터를 삭제 준다고 약속 할 수있는 경우에만 :

#include<iostream> 
#include<string> 
std::string* F1() 
{ 
    std::string* s=new std::string[2]; 
    s[0]="Hello"; 
    s[1]="World"; 
    return s; 
} 

int main() 
{ 
    std::string* ss=F1(); 
    std::cout<<ss[0]<<ss[1]; 

    delete[] ss; //important step 
} 
+0

예외가 없으면 가장 좋은 컴파일, 그렇지 않으면 아무것도 유출 메모리가 누출 ... –

4

나는 옵션은 말할 것 : 문자열의 고정 된 수의 경우

:

1) 한 쌍, 튜플, 또는 당신이 자신을 정의하는 구조체를 반환합니다. 뭔가 같은 : 다음

struct BrokenDownString { 
    std::string firstbit; 
    std::string middlebit; 
    std::string endbit; 
}; 

중 하나

BrokenDownString decode(std::string message); 

하거나 매개 변수로 메시지를 복용 생성자를 BrokenDownString 제공합니다.

void decode(const std::string &message, std::string &out_1, std::string &out_2) { 
    out_1 = /*whatever*/; 
    out_2 = /*whatever*/; 
} 

두 문자열 아무것도 (심지어 배열) 과잉이다 :

2) 밖으로 여러 포인터 또는 비 일정한 기준에 의해 PARAMS보십시오. 문자열의 변수 번호에 대한

은, 그러나, 당신이 중 하나를 수행 할 수 있습니다

1) 돌려 std::vector<std::string> (이 초과 복사 될 수 있습니다 점에 유의).

2) 매개 변수로 std::vector<std::string> &을 가져 와서 결과를 추가합니다 (이 경우 문자열은 복사 할 수 있지만 컨테이너는 복사 할 수 없음).호출자가 벡터 결과 원한다면

template<typename OUT> 
void decode(const std::string message, OUT out) { 
    // do parsing 
    *(out++) = firstbit; 
    *(out++) = nextbit; 
    // etc. 
} 

이어서 :

std::vector<std::string> v; 
decode(message, std::back_inserter(v)); 

를 호출자에게 선호한다면

3) 파라미터로서 출력 반복자 복용 복호화 함수 서식 할 deque에서 :

std::deque<std::string> d; 
decode(message, std::back_inserter(d)); 

호출자가 역순으로 목록에서 원하는 경우 :

std::list<std::string> l; 
decode(message, std::front_inserter(l)); 

등등.

위 같은 것을 원하는 경우 4)하지만 어떤 이유로 당신은 템플릿 코드를 작성 디코드가 매개 변수로는 각 문자열의 통지 대상, 걸리고 싶지 않은 :

struct DecodeTarget { 
    virtual void append(const std::string &) = 0; 
}; 

void decode(std::string message, DecodeTarget &out) { 
    // do parsing 
    out.append(firstbit); 
    out.append(nextbit); 
    // etc. 
} 

그런 다음 발신자는 벡터에 결과를 원하는 경우 : 당신이 절대적으로 배열을 반환해야하는 경우

class VectorTarget : public DecodeTarget { 
private: 
    std::vector<std::string> &results; 
public: 
    VectorTarget(std::vector<std::string> &v) : results(v) { } 
    void append(const std::string &bit) { v.push_back(bit); } 
}; 

std::vector<std::string> v; 
VectorTarget vt(v); 
decode(message, vt); 
1

, 당신은 사실을 사용할 수있는 포인터로 원시 배열 붕괴가. 이 방법은 다음을 추적 할 필요

#include <iostream> 
#include <ostream> 
#include <string> 

std::string * decode() 
{ 
    std::string *ret = new std::string[2]; 
    ret[0] = "foo"; 
    ret[1] = "bar"; 
    return ret; 
} 

int main() 
{ 
    std::string *baz = decode(); 
    std::cout << baz[0] << baz[1] << std::endl; 
    delete [] baz; 

    return 0; 
} 

공지 것을 : 여기에 몇 가지 예제 코드는 내가 원하는 생각하지 그입니다 decode()

  • 사실에 의해 반환 된 메모리를 소유

    • 반환 된 포인터가 배열
    • 배열의 크기를 정말 그

    예, 고통 스럽습니다. 그래서 다른 모든 사람들이 std::pair 또는 std::vector을 사용하여 작업을 처리 할 것을 제안했습니다.

  • 0

    나는 실제로이 특정 사건에 대한 이런 식으로 일을 권하고 싶지 않다,하지만 당신은 문자열의 배열에 참조를 반환 할 수 있습니다

    std::string(& split_once(std::string arg))[] 
        static std::string result[2]; 
        int i = arg.find_first_of('|'); 
        result[0] = arg.substr(0,i); 
        result[1] = arg.substr(i + 1); 
    } 
    

    이이 특정에 적합하지 않습니다 응용 프로그램이지만 이며 배열을 반환하는 유효한 방법이며 다른 상황에서 유용합니다. 나는 어딘가에서 사용했다고 생각하는데, 어디서 왜 그 이유를 기억하지 못한다.

    0

    할 수 있습니다 :

    std::vector<std::string>,하는 std::pair<std::string, std::string>을 반환 문자열이나와 구조체를 반환, 반환에 대한 참조를 전달하고 그것을 설정하지 반환 :

    void decode(std::string & s1, std::string & s2, const std::string & otherParam) { 
        // write the result to s1 and s2 
    } 
    

    을하면 방지 할 수 있습니다 참조 불필요한 사본.

    관련 문제