2009-06-14 10 views

答えて

6

あなたは、いくつかの文字列を返す、次のいずれかを使用する必要がある場合:
- のstd ::ペア
- ブースト::タプルが
- あなたはどのように多くの文字列がわからない場合は構造

あなたの関数がしますreturn - std :: vectorのようなものを使います。

+1

すぐに、それはstd :: tupleになります。boost :: tupleではなく: – Zifre

4

それは私だったら、私はvectorstringのsを返しますと思います。配列では、メモリ管理について心配する必要があります。また、変更したくない場合は、const参照として文字列を渡すこともできます。

+0

私はTop Coderの練習セッションから得ました。文字列を返すように質問されています。 – abc

1

あなたがハードコアを感じていて、挑戦しているなら、チャール**を返すことができます。あなたはおそらく代わりに標準コンテナまたは文字列クラスに固執する必要がありますので、

しかし、これは、非常にエラーが発生しやすくなります。

+0

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

+0

@ siddhant3s:彼はchar **を意味し、mainのargvと同じです。 NULLターミネータを使用してください。これは古いことです。あなたはこのアプローチをC++で非推奨にするべきですが、うまくいくでしょう。 – dmckee

0

は「アウト」のパラメータとして関数に文字列を渡す - ポインタまたは参照によりおよび関数内でそれらを変更のいずれか。

1

はなかった彼ら(トップコーダー)言及したC-文字列の配列またはSTD ::文字列の配列?あなたがまだの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与えます。

2)は、ポインタまたは非一定の基準によって、複数のparamsを取る:二つの文字列の場合

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

を、何か(偶数列)が過剰です。文字列の可変数、しかし、あなたはどちらかの缶用

1)(これは過剰コピーをもたらす可能性があることに注意してください)std::vector<std::string>を返します。

2)をパラメータとしてstd::vector<std::string> &をとり、そして(これは容器の文字列をコピーしなくてもよい)の結果を追加します。

3)パラメータとして出力イテレータを取って、デコード関数テンプレートを作る:

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)); 

、発信者がそれらを好む場合デッキ内:

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 
    } 
    

    参照すると、あなたが防ぐことができます不要なコピー。

    関連する問題