2012-02-13 14 views
1

私は、文字列のベクトルのベクトルの各最初の文字列へのポインタを保持するベクトルを作成しようとしています。 \bin\sortプログラムにfirst_words_in_subvecsを渡して並べ替え/印刷します。私は、実際の文字列の新しいベクトルを作るのは、CPUと時間の無駄だと思っていました。なぜなら、とにかくそれらを渡すつもりだからです。送信したい文字列へのポインタを作成するほうが速くなると思っていますか?なぜこのコードは動作しないのですか?私は警告やエラーは出ませんが、私がそれを実行するとエラーが発生します。別のサブベクトルのアイテムへのポインタベクトルを作成するにはどうすればよいですか?

int print_sorted_subvectors(vector< vector<string> > &sorted_subsets_vec) 
{ 
    vector<string*> first_words_in_subvecs; 

    for(int i = 0; i < sorted_subsets_vec.size(); i++) 
    { 
     first_words_in_subvecs[i] = &sorted_subsets_vec[i][0]; 
    } 
} 
+1

あなたは['std :: sort()'](http://en.cppreference.com/w/cpp/algorithm/sort)を知っていますか? –

+0

私は今です!それは簡単になるでしょう...フォークとbin \ sortを使用して割り当ての別の部分をソートしていましたので、もう一度使用するつもりでしたが、それはずっと簡単です...愚かなパイプ...そうです私はポイントの代わりにコピーしなければならないと思う。しかし、これはどのようにして行われますか?私はまだ興味があります。 – Marty

答えて

1

おそらくベクトルの文字列へのポインタを格納する必要はありません。 std::stringクラスは、実際の文字列データの不要なコピーを避けるためにcopy-on-writeなどのテクニックを使用すると、かなり効率的です。 first_words_in_subvecsが普通のvector<string>であれば、効率の問題はないでしょう(また、コードも分かりやすく、信頼性も高くなります)。

なぜあなたの現在のコードがsegfaultingであると言うのは難しいです。 sorted_subsets_vecのすべてのサブベクトルが空ではないことは確かですか?

+0

それかもしれません。ベクトルを通ってどの要素が最小であるかを教えてくれる同様の関数がありますか?実際にソートする必要はありません。最小の要素を見つけるだけです。 min_elementは機能しますか? – Marty

+0

@FrederickCraine:うん、['std :: min_element'](http://en.cppreference.com/w/cpp/algorithm/min_element)は、あなたが望むことをするでしょう。これはイテレータを返すので、 '.end()'と照合して要素があるかどうかを調べる(または '.empty()'を最初にチェックする)。 –

関連する問題