2017-01-25 8 views
0

私はこのメッセージボードを販売したいと思っています。最終的にすべてを読み込む方法を理解しましたが、アイテムを比較する方法についてのアドバイスが必要です。ファイルを読み込んだときに、配列をチェックして、必要な項目がある(true)かどうかを確認し、すでに配列に入っている項目の名前を数えて販売したいとします。一致が見つかった場合は、その項目を追加せず、配列から必要な項目を削除してシフトします。マッチの追加と削除を同時に行っている間に配列内のアイテムを比較する

#include <iostream> 
#include <sstream> 
#include <fstream> 
#include <cstdlib> 
#include <list> 


using namespace std; 

struct messageBoard { 
string item; 
bool forSale; 
int price; 

}; 


int main(){ 
    messageBoard board; 
    const int arrayLength = 100; 
    std::list<messageBoard> arr; 
    int index = 0; 
    string filename; 
    ifstream words; 
    cout<<"Please enter the filename:"; 
    cin>>filename; 
    words.open(filename); 
    if (words.fail()) { 
     cout << "file not found or something" << endl; 
    }else { 
     string word;; 
     while (getline(words, word)) { 
      int wordIndex = 0; 
      stringstream ss; 
      ss << word; 
      while (getline(ss, word, ',')){ 
       if (wordIndex==0){ 
        board.item = word; 
        } 
       else if (wordIndex==1&&word==" for sale"){ 
        board.forSale = false; 
        } 
       else if (wordIndex==1&&word==" wanted"){ 
        board.forSale = true; 
        } 
       else if (wordIndex==2){ 
        board.price = atoi(word.c_str()); 
        } 
        wordIndex++; 


      } 
      index ++; 
      arr.push_back(board); 


     } 
    } 
    words.close(); 
    for(std::list<messageBoard>::iterator it = arr.begin(); it != arr.end(); it++) { 
     std::cout << "item: " << (it)->item << " bool: " << (it)->forSale <<"Price: "<<(it)->price << std::endl; 

}

}

答えて

1

私はあなたのためのコードを書くことはありませんが、私は問題にアプローチしたいどのように私はあなたを教えてあげましょう。

まず、私は、リストに要素を追加list::push_backを使用するにはarr

std::list<MessageBoard> arr; 

として再定義したいです。

場合(真)望んでいたし、アレイ

そうでない場合はfalseこれらの条件が満たされている場合はtrueを返しbool機能を書くには、すでに項目の名前をmathcesされている項目。

機能を使用して、std::findまたはstd::find_ifでリストをスキャンします。検索が成功すると、関数は必要な項目を指すイテレータを返します。

イテレータに指名手配アイテム

使用list::eraseを削除します。あなたが混乱した場合、無効なイテレータを削除した結果は定義されていませんが、ランタイムライブラリが大声であなたに知らせるでしょう。

不要にシフトします。リストの長さはそれ自身を処理します。

効率的な検索の場合はstd::set、同一の要素の数を保持する場合はstd::map<MessageBoard, int>と考えることもできます。

標準のライブラリコンテナを使用することで、ロジックを配列要素の位置から処理し、メッセージに一致する問題に近づけることができます。ループの数も少なくなります。

arrは、boardまたはmessagesのようなものです。コンパイラに知られていない意味を伝えるために名前を使用します。また、atoiはここで少し外れています。すでにstringstreamの地域にいるので、そのように価格を引き出すこともできます。

stringstream sw(word); 
sw >> arr[index].price; 

HTH。

+0

アドバイスをいただき、ありがとうございました。今後の進歩のためのガイドラインとしてご利用いただけると幸いです。 –

+0

私はあなたが提案したようにリストを実装しました。あなたが話したブール関数にはどのようなパラメータが必要でしょうか。ボードとアールを比較するか? @ジェームズ・K・ローデン –

関連する問題