【STL】vector の情報に iteratorでアクセスする方法が分かりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
TOMY
記事: 53
登録日時: 7年前
住所: 愛知県
連絡を取る:

【STL】vector の情報に iteratorでアクセスする方法が分かりません

#1

投稿記事 by TOMY » 7年前

こんばんは。現在vectorに関わるiteratorの使い方で少し詰まってしまったので質問させて頂きます。

自作クラスを格納するvectorコンテナを一つ作り、それに関連するiteratorを作ったのですが、
そのiteratorを介してコンテナ内の情報にアクセスしたいと思っています。
mapに関連したiteratorの場合
アロー演算子でそのiteratorのさす場所のKEY やDATAにアクセス出来たのでvectorでも出来るかとたかをくくっていたのですが、
実際にやってみるとそこの部分でのみどうしてもC2039エラーが起きてしまいます。つきましては解決方法のご指南をして頂きますようお願いします。

プログラム自体はCSVファイルを読み取ってその読み取った情報がちゃんと出るか確認するだけのコンソールアプリケーションでございます。

問題の部分はCGameData.cppの35行目でございます。
添付ファイル
GameDataClassTestConsolProject.zip
(863.21 KiB) ダウンロード数: 31 回
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません

#2

投稿記事 by h2so5 » 7年前

問題の箇所が数行しかないのにzipを添付する意味はあるんでしょうか?

そもそもこのコードはイテレータを参照していないですね。

コード:

void CGameData::DrawEnemyContainerData(){

	for(m_EnemyIterator = m_EnemyContainer.begin(); m_EnemyIterator != m_EnemyContainer.end(); m_EnemyIterator++){
		//↓ここでコンテナ内に格納した情報にアクセスして(ちゃんと格納できている確認するという意味で)表示したい
		//printf("%d\n"*m_EnemyContainer.Type);
	}

}
正しく書くならこうでしょう。イテレータはローカル変数にしたほうが良いです。
(typedef や "it" は僕の好みの問題です)

コード:

void CGameData::DrawEnemyContainerData(){

	typedef vector<CEnemyFunc>::iterator Iterator;
	for(Iterator it = m_EnemyContainer.begin(); it != m_EnemyContainer.end(); it++){
		printf("%d\n", it->Type);
	}

}

アバター
TOMY
記事: 53
登録日時: 7年前
住所: 愛知県
連絡を取る:

Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません

#3

投稿記事 by TOMY » 7年前

ん~・・・h2so5さんの言うとおりにしても、エラーが発生してしまいます。
エラーの内容は
C2513 std::_Vector_Iterator<_Ty._Alloc>指定された型は識別子の名前を指定せずに宣言しています。
です。
コンテナとイテレーターが認識されていない?・・・
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

Suikaba
記事: 194
登録日時: 9年前

Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません

#4

投稿記事 by Suikaba » 7年前

コード:

void CGameData::DrawEnemyContainerData()
{
    const auto end = std::end( enemy_container );
    for( auto it=std::begin( enemy_container ); it!=end; ++it )
    {
         // std::vector<EnemyDrawData*> enemy_containerのように宣言されていて、メンバ関数にdrawがあるなら
         (*it)->Draw();
    }
}
これでいかがでしょう。
これだけの用途なら、range-based for(C++11)を用いて

コード:

void CGameData::DrawEnemyContainerData()
{
    for( auto& data : enemy_container )
    {
        data->Draw();
    }
}
のほうが楽かと思われます。
あんまり質問文読めてないのと眠いのでずれてるかもしれません。ごめんなさい。

Suikaba
記事: 194
登録日時: 9年前

Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません

#5

投稿記事 by Suikaba » 7年前

一応元のコードみました。

コード:

#include <iostream>
#include <vector>

struct enemy_func
{
	int type;
	int behavior;
	int frame;
	float x, y, z;
};

class game_data
{
	std::vector<enemy_func> enemy_container_;

public:
	game_data()
	{
		// テストデータ
		enemy_func tmp1 = { 0, 0, 0, 0.0, 0.1, 1.0 };
		enemy_func tmp2 = { 1, 2, 3, 4.0, 5.1, 1.9 };
		enemy_container_.push_back( tmp1 );
		enemy_container_.push_back( tmp2 );
	}

public:
	void draw()
	{
		const auto end = enemy_container_.end();
		for( auto it=enemy_container_.begin(); it!=end; ++it )
		{
			std::cout << it->type << "\n";
		}
		std::cout << std::endl;
	}
};


int main()
{
	game_data data;
	data.draw();
}
出力結果:
0
1

Suikaba
記事: 194
登録日時: 9年前

Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません

#6

投稿記事 by Suikaba » 7年前

C2513はググったらすぐでますので、幸運を!

【追記】
*m_EnemyContainer.Type
とはじめ書いていらっしゃったようですが、参照剥がしの*演算子よりもメンバアクセスの.演算子のほうが優先度が高いので、C2039になるんじゃないでしょうか。なので(*m_EnemyContainer).Typeと書くか、m_EnemyContainer->Typeとするかですね。

アバター
TOMY
記事: 53
登録日時: 7年前
住所: 愛知県
連絡を取る:

Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません

#7

投稿記事 by TOMY » 7年前

解決出来ました。純粋に変数名に使った”Iterator”と言う名前がアウトだっただけみたいです。
”It”に改名したら普通に使えました。
一応タイトルの部分の問題は解決したのでタグを付けさせてもらいます。
Suikaba さんが書きました:【追記】
*m_EnemyContainer.Type
とはじめ書いていらっしゃったようですが、参照剥がしの*演算子よりもメンバアクセスの.演算子のほうが優先度が高いので、C2039になるんじゃないでしょうか。なので(*m_EnemyContainer).Typeと書くか、m_EnemyContainer->Typeとするかですね。
あ、そこは最初に調べた時に出てきた方法で試しに使った部分です。 アローでうまく行かなかったので試してみたんですがやっぱりダメですよね。

タイトルの部分を解決したプロジェクトを上げておきます。
添付ファイル
GameDataClassTestConsolProject.zip
(1.14 MiB) ダウンロード数: 9 回
百聞は一見にしかず。うんちくだけを頭にぶち込む前に実際に実験した方がいいよ。
書籍とか経験談とか見て知識をつけるのも大事だけど。

閉鎖

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