- 【初心者歓迎】C/C++室 Ver.98【環境依存OK】 [無断転載禁止]©2ch.net
955 :デフォルトの名無しさん[sage]:2016/07/20(水) 04:52:43.46 ID:/LEefS5m - setとかをiterator itrで回してて、x=*itrでxを定義したらやっぱりコピーなんですかね?
参照になってほしいんですが、&x=*itrてしたらVisual Studioに怒られます
|
- 【初心者歓迎】C/C++室 Ver.98【環境依存OK】 [無断転載禁止]©2ch.net
963 :デフォルトの名無しさん[sage]:2016/07/20(水) 18:12:57.01 ID:/LEefS5m - エスパーさせて申し訳ないです
例えば下記のような自作クラスMyClassのunordered_setを作って、それぞれの要素のprivateメンバー変数NUMBERSをループの中で変えたいです main部は次のレスに書きます class MyClass { public: MyClass() {} set<int>& numbers() { return NUMBERS; } void add_to_numbers(int x) { NUMBERS.insert(x); } void set_hash() { identity = *(NUMBERS.begin()); } int hash() const { return identity; } bool operator==(const MyClass& c) const { return identity == c.hash(); } private: set<int> NUMBERS; int identity; }; namespace std { template<> class hash<MyClass> { public: size_t operator()(const MyClass& c) const { return c.hash(); } }; }
|
- 【初心者歓迎】C/C++室 Ver.98【環境依存OK】 [無断転載禁止]©2ch.net
964 :デフォルトの名無しさん[sage]:2016/07/20(水) 18:14:02.75 ID:/LEefS5m - mainです。コピーの操作になってしまうので結果は変わりませんでした。
>>958のようにMyClass m = *itr;をMyClass const& m = *itr;とすると エラー:オブジェクトにメンバー関数と互換性のない型修飾子がありますオブジェクト型はconst MyClassです と出ます。どうしたら参照でループさせて直接書き換えられるか教えて下さいお願いします int main(){ unordered_set<MyClass> M; MyClass m[10]; for (int i = 0; i < 10; i++) { m[i].add_to_numbers(i); m[i].set_hash(); M.insert(m[i]); } cout << "初期状態" << endl; for (auto m : M) { cout << "要素: "; for (auto elem : m.numbers()) cout << elem << ","; cout << endl; } cout << "\n要素操作" << endl; int count = 1; for (auto itr = M.begin(); itr != M.end(); itr++){ MyClass m = *itr; m.add_to_numbers(count); m.set_hash(); count++; } for (auto m : M){ cout << "要素: "; for (auto elem : m.numbers()) cout << elem << ","; cout << endl; } return 0; }
|
- 【初心者歓迎】C/C++室 Ver.98【環境依存OK】 [無断転載禁止]©2ch.net
969 :デフォルトの名無しさん[sage]:2016/07/20(水) 19:00:21.11 ID:/LEefS5m - なるほどそうですか
hashが変わるようなことできないようになってるんですね じゃあコピーを操作して手動で入れ替えるしかないですね
|