2017-01-27 6 views
-1

こんにちは私はすべてのテキストを分割する機能を試してみます。たとえば、apple :: google :: dsfと入力すると、区切り文字は::すべての要素が配列の場所に配置されます。私はこれを成功させましたが、今は私のメインでこのアレイを使用できるようにしたいと考えています。だから、私は主に自分の関数で返す配列を出力し、関数Split()から配列を出力したくない。だから私の質問は、これを行う方法です?それを反復よりも、変数でポインタを返す関数の配列を出力する

int main() 
{ 
    string buffer; string delimitor = "::"; 
    unsigned int param = 0; 
    cout << "Please enter how many param: "; cin >> param; 
    cout << "Please enter something in the buffer: "; cin >> buffer; 
    Split(buffer, delimitor, param); 

    system("PAUSE"); 
    return 0; 
} 

string* Split(string buffer, string delimitor, unsigned int nbr_param) 
{ 
    string* arr = new string[nbr_param]; 
    unsigned int start = 0, end = buffer.find(delimitor), count = 0; 
    while (end != string::npos) 
    { 
     arr[count] = buffer.substr(start, end - start); 
     start = end + delimitor.length(); 
     end = buffer.find(delimitor, start); 
     count++; 
    } 
    if (end == string::npos) 
    { 
     arr[count] = buffer.substr(start, end); 
    } 

    return arr; 
} 
+2

'std :: vector 'を生の所有ポインタよりもうまく返すほうがいいです。 – Jarod42

答えて

2

ストア戻り値: は、これは私のコードです。

std::string* words = Split(buffer, delimitor, param); 
for (std::size_t i = 0; i != param; ++i) { 
    std::cout << words[i] << std::endl; 
} 
delete[] words; 

あなたがstd::vector<std::string>を返却した場合、あなたはstd::vectorpush_backフラグメントを使用し、離れて完全にnewで行うことを容​​易になるだろう

const auto& words = Split(buffer, delimitor); // param is no longer needed. 
for (const auto& word : words) { 
    std::cout << words[i] << std::endl; 
} 
1

を行うことができます。 RVOのために、返されたベクトルが移動または構築されるため、おそらく効率的です。

とにかく、mainの変数に戻り値を割り当てる必要があります。今すぐ分割を呼び出して値を破棄し、メモリをSplitにリークします。

関連する問題