2016-05-21 12 views
3

私はこの質問への最高の定格答えを文字列分割機能を使用したい:なぜ "void"の代わりに "std :: vector <std::string>"と表示されますか?

Split a string in C++?

便宜のために答えをコピー:私はここに疑問を持っている

#include <string> 
#include <sstream> 
#include <vector> 

std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) { 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
     elems.push_back(item); 
    } 
    return elems; 
} 


std::vector<std::string> split(const std::string &s, char delim) { 
    std::vector<std::string> elems; 
    split(s, delim, elems); 
    return elems; 
} 

。なぜ宣言はvoid split(...)ではなくstd::vector<std::string> &split(...)ですか?議論として、私たちはstd::vector<std::string> &elemsを受け取り、これは私たちが終わらせたいものです。参照を受け取ると何かを返すのはなぜですか?

int &multA (int &n) 
{ 
    n = 5*n; 
    return n; 
} 

void multB (int &n) 
{ 
    n = 5*n; 
} 

と::

私が持っている

int n1, n2; 
n1 = 1; 
n2 = 1; 
cout << "n1: " << n1 << endl; 
cout << "n2: " << n2 << endl; 
n1 = multA(n1); 
multB(n2); 
cout << "n1: " << n1 << endl; 
cout << "n2: " << n2 << endl; 

をし、その結果として、私が持っている:

n1: 1 
n2: 1 
n1: 5 
n2: 5 

違いは、その後何ですか?

+2

これは単なる便利なので、必要に応じて戻り値を左辺値として使用できます。 – Aenimated1

+0

これはメモリ管理と関係があります –

答えて

5

参照を返すと、別の関数の引数としてsplit()を呼び出すことができます。例えば、我々は、参照により

void func(std::vector<std::string> &elements); 

split()場合戻る参照を文字列のベクトルを受け付ける他のいくつかの機能を持っていると仮定し、func()に直接戻り参照を渡すことが可能です。

func(split(s, delim, elems)); 

split()は参照を返しませんでした場合、split()が参照を返す場合には、第2の使用法はまだ動作

split(s,delim, elems); 
    func(elems); 

を行うために必要となる、一方。

これらの2つの違いは、プログラマの利便性だけですが、多くのプログラマが最初の呼び出しスタイルを使用することを好みます。参照を返すことは、特に高価な操作ではないので、プログラマーは使用方法の選択肢をあまり失うことはありません。

1

投稿した例には違いがありません。

ただし、別の変数に割り当てたり、関数に渡したりすることができます。

ここ
int a = multA(n1); //In one line :) 
foo(multA(na1)); //Same thing, one line only 

multB(n1); 
int a = n1; //Two lines 

multB(n1); 
foo(n1); //Two lines 

multAあなたはmultBに代わり2の1行でそれを書くことができますので、明らかに優れています。だから基本的に唯一の違い。

3

機能をより柔軟にする構文糖です。例によって

:あなたはvoid仮説のケースで

std::cout << "there are " << split(str, delim, vect).size() << " elemements\n"; 

を書くことができ、あなたは2文を必要としています。

+1

"命令"ではなく "文"という言葉を使用する方が正しいでしょう。 – Peter

+0

@ Peter - ありがとう。私は英語のネイティブスピーカーではないので、正しい言葉を使って失敗することがよくあります。私は自分の答えを正す。 – max66

+1

問題はありませんが、あなたの答えの英語はうまくいきました。 「ステートメント」という言葉は、C++で特別な意味を持ちます。単語 "命令"(この文脈で)はコンピュータサイエンスにおいて特別な意味を持ち、C++のステートメントとは異なります。あなたが与えたそのコードのサンプルは、単一のC++ステートメントです。 – Peter

0

結果として、これら2つの方法の間には全く違いはありません。

ただし、オプション1は、関数multAに計算結果があり、その結果が返されることを明確にします。

n1 = multA(n1); 

一方、2番目のオプションは、最初のオプションと同じように自明ではありません。 multBが何をしているのか簡単には分かりません。次のコードを読んでください。 multBは単にstd::coutで結果を記録している可能性があります。しかし、関数の定義を読まなくてはわかりません。

multB(n2); 
関連する問題