std::listの優先順位

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

std::listの優先順位

#1

投稿記事 by 夢幻ノ月夜 » 4年前

今、抽象クラスのポインタのリストを作って簡易的にタスクシステムのようにしているのですが
優先順位が上手く反映されません(常に自機が一番上に来てしまう)

コード:

void Object_Manager::AddTask(CObject *obj){
	if(List.empty()){
		List.push_front(obj);
		return;
	}
	for(auto itr=List.begin();;itr++){
		if(itr == List.end()){
			List.push_back(obj);
		}
		if( *itr < obj){
			List.insert(itr,obj);
			return;
		}
	}
}


//operator <の内容
bool operator <(const CObject &obj)const{
	return priority < obj.priority;
}
現時点でのコードはこんな感じです
何が間違っているのか教えてください
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
みけCAT
記事: 6312
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: std::listの優先順位

#2

投稿記事 by みけCAT » 4年前

Listが未定義ですが、タイトルとコードからstd::list<CObject*>と仮定します。
すると、
  • objがListの要素でない時、List.end()であるitrをデリファレンスし、無効な値を比較に使用してしまう。
  • オブジェクトではなくポインタを比較しているため、ここで提示されているoperator <は利用されない。
という所がやばいでしょう。

改善するには、おそらく
  • itr == List.end()だった時、追加した後returnする
  • ポインタ同士ではなく、それらが指しているオブジェクト同士を比較するようにする
といいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: std::listの優先順位

#3

投稿記事 by 夢幻ノ月夜 » 4年前

みけCAT さんが書きました:Listが未定義ですが、タイトルとコードからstd::list<CObject*>と仮定します。
すると、
  • objがListの要素でない時、List.end()であるitrをデリファレンスし、無効な値を比較に使用してしまう。
  • オブジェクトではなくポインタを比較しているため、ここで提示されているoperator <は利用されない。
という所がやばいでしょう。

改善するには、おそらく
  • itr == List.end()だった時、追加した後returnする
  • ポインタ同士ではなく、それらが指しているオブジェクト同士を比較するようにする
といいでしょう。
①は分かったのですが、
②のそれらが指しているオブジェクト同士を比較するにはどうしたらいいんでしょうか
*で出来るものなのでしょうか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
みけCAT
記事: 6312
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: std::listの優先順位

#4

投稿記事 by みけCAT » 4年前

夢幻ノ月夜 さんが書きました:①は分かったのですが、
②の
①や②はここでは未定義でしょう。
夢幻ノ月夜 さんが書きました:それらが指しているオブジェクト同士を比較するにはどうしたらいいんでしょうか
オブジェクト同士を比較するコードに修正し、コンパイルし、実行すればいいです。
ポインタに対し単項*演算子を用いるとそのポインタが指しているオブジェクトが得られるので、それを比較しましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: std::listの優先順位

#5

投稿記事 by 夢幻ノ月夜 » 4年前

みけCAT さんが書きました:
夢幻ノ月夜 さんが書きました:①は分かったのですが、
②の
①や②はここでは未定義でしょう。
夢幻ノ月夜 さんが書きました:それらが指しているオブジェクト同士を比較するにはどうしたらいいんでしょうか
オブジェクト同士を比較するコードに修正し、コンパイルし、実行すればいいです。
ポインタに対し単項*演算子を用いるとそのポインタが指しているオブジェクトが得られるので、それを比較しましょう。

コード:

if(*(*itr) < *obj){
	List.insert(itr,obj);
	return;
}
クソ重くなった挙句順位反映されない(´・ω・`)
やっぱり何かが間違っているのでしょうか
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
夢幻ノ月夜
記事: 140
登録日時: 5年前
住所: Stens;Gate世界線

Re: std::listの優先順位

#6

投稿記事 by 夢幻ノ月夜 » 4年前

コード:

void Object_Manager::AddTask(CObject *obj){
	if(List.empty()){
		List.push_front(obj);
		return;
	}
	for(auto itr=List.begin();;){
		if((*itr++) < obj){
			List.insert(itr,obj);
			return;
		}
		if(itr==List.end()){
			List.push_back(obj);
			return;
		}
	}	
}
こうしたら上手くいったらしいので解決です
ありがとうございました
毎回ゲーム作ろうとするたびに壁にぶち当たる

閉鎖

“C言語何でも質問掲示板” へ戻る