2017-05-06 4 views
3

cppで文字列を読み込んで割り当てられたメモリに保存するプログラムを作成します。私がする必要がある余分な仕事は、入力の大きさが予想以上の状況を扱うことです。私はコードをテストするとき、それは最終的なメモリセーブの内容を表示しない、自動的に終了することはできません。ここにコードがあります。C++でメモリを割り当てるときのエラー

#include <iostream> 
#include <memory> 
using namespace std; 
int main(){ 
    allocator<string> sa; 
    cout << "Please input the amount of words" << endl; 
    int count; 
    cin >> count; 
    auto p = sa.allocate(count); 
    cout << "Please input the text" << endl; 
    string s; 
    auto q = p; 
    while(cin >> s){ 
     if (q == p + count) { 
      auto p2 = sa.allocate(count * 2); 
      auto q2 = uninitialized_copy_n(p, count, p2); 
      while (q != p) { 
       sa.destroy(--q); 
      } 
      sa.deallocate(p, count); 
      p = p2; 
      q = q2; 
      count *= 2; 
     } 
     sa.construct(q++, s); 
    } 
    for (auto pr = p; pr != q; ++pr) { 
     cout << *pr << " "; 
    } 
    cout << endl; 
    while (q != p) { 
     sa.destroy(--q); 
    } 
    sa.deallocate(p, count); 
    return 0; 
} 
+0

なぜこのためのアロケータを使用しますか?私はあなたがstd :: vectorやstd :: stringのようなコンテナである新しい、あるいはより良い(!)の代わりにこれを使うことに驚いています。 –

答えて

6

なぜアロケータを使用しますか?このテンプレートはコードで直接使用しないでください。 STLコンテナの振る舞いを調整するために使用されると考えられます。あなたは初心者なので触らないでください。この機能は、高度な開発者が極端な場合に使用するためのものです。

単にstd::vector<string>を使用するだけで、必要なすべての機能が利用できます。

cout << "Please input the amount of words" << endl; 
int count; 
cin >> count; 
auto v = vector<string> {}; 
v.reserve(count); 

string s; 
while (cin >> s) 
{ 
    v.push_back(s); 
} 
+0

'reserve'呼び出しを追加します。 – LogicStuff

+0

あなたの提案をありがとう。私はそうしようとしています。その本のC++のプライマーは私にそうするよう促しています。確かに初心者です:) – Saeron

+0

明らかに本の著者は、彼がどのようにスマートであるかを証明したい、代わりに基礎から始まるC + +を教える本を書いています。あなたは何本の本を共有できますか? –

関連する問題