2017-11-21 14 views
0
struct data 
{ 
    int price; 
    int qty; 

    bool operator<(const data&rhs)const 
    { 
     return price<rhs.price; 
    } 
    bool operator==(const data&rhs)const 
    { 
     return price==rhs.price; 
    } 
}; 

set<data> bar; 

int main(int argc,char** argv) 
{ 
    data info; 
    set<data>::iterator iter; 
    int a[10]={100,120,500,142,142,245,62,52,12,1}; 

    for(int i=0;i<10;i++) 
    { 
     info.price=a[i]; 
     info.qty=a[i]; 
     //some logic to find the price and if found then simply add the qty 



     //********This part of the code doesnt work(NO ERROR)********* 
       iter=bar.find(info);//Find before insert 
       info.qty+=(*iter).qty;//then add 
     //****************************************** 

     bar.insert(info); 
     //code to print the set 
    } 
    return 0; 
} 

価格がすでにsetに存在するかどうかを調べたい場合は、数量を追加します。
setに142が追加されているので、次の142aにある場合は、それを既存のエントリに追加する必要があります。
私はマップでこれを行う方法を知っているが、それは構造体の集合であるから、私はC++で構造体を検索する

に最終的な所望の出力にそれを操作することはできませんよ。他の人が指摘したように、へのアクセスを

Price...Qty
1...........1
12.........12
52.........52
62.........62
100.......100
120.......120
142.......284 ///Here it finds and then adds the qty
245.......245
500.......500

+0

あなたは単に '' std :: set :: find'(http://en.cppreference.com/w/cpp/container/set/find)を探していると思うか、 'set'に挿入する前の価格(コードコメントのように)' std :: find'を使うことができます( 'set'でも使うことができます) – Tas

+1

' std :: set'の要素はconstです。 'qty'やそれ以外のものを追加することで変更することはできません。あなたができることは、既存の要素を削除し、修正された要素を元に戻すことです。 –

+0

はい、目的の値が挿入されていません。ありがとう。 @IgorTandetnik –

答えて

1

をセット内のアイテムはconst参照を介しているため、通常は変更できません。この問題はマップに適しています。 1本のラインが後方にあるので、あなたのコードがコンパイルされ、なぜ

理由は次のとおりです。

  info.qty+=(*iter).qty;//then add 

であるべき:

  (*iter).qty+=info.qty;//then add 

はちょうどこの変更は、コンパイルエラーを与える行います。あなたがセットを使用しなければならない場合は、エラーを回避するために、可変qtyメンバーマークすることができます。このためmutableを使用

mutable int qty; 

をおそらくしかし、多くの人に悪い習慣と考えられます。問題は任意のconstを参照してdataオブジェクトに変更すると、qtyメンバを変更できるようになりました。

+0

これはまさに私が探していたものです。ありがとう@davmac –