ページ 1 / 1
【STL】vector の情報に iteratorでアクセスする方法が分かりません
Posted: 2013年1月21日(月) 19:32
by TOMY
こんばんは。現在vectorに関わるiteratorの使い方で少し詰まってしまったので質問させて頂きます。
自作クラスを格納するvectorコンテナを一つ作り、それに関連するiteratorを作ったのですが、
そのiteratorを介してコンテナ内の情報にアクセスしたいと思っています。
mapに関連したiteratorの場合
アロー演算子でそのiteratorのさす場所のKEY やDATAにアクセス出来たのでvectorでも出来るかとたかをくくっていたのですが、
実際にやってみるとそこの部分でのみどうしてもC2039エラーが起きてしまいます。つきましては解決方法のご指南をして頂きますようお願いします。
プログラム自体はCSVファイルを読み取ってその読み取った情報がちゃんと出るか確認するだけのコンソールアプリケーションでございます。
問題の部分はCGameData.cppの35行目でございます。
Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません
Posted: 2013年1月21日(月) 20:07
by h2so5
問題の箇所が数行しかないのに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);
}
}
Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません
Posted: 2013年1月22日(火) 00:01
by TOMY
ん~・・・h2so5さんの言うとおりにしても、エラーが発生してしまいます。
エラーの内容は
C2513 std::_Vector_Iterator<_Ty._Alloc>指定された型は識別子の名前を指定せずに宣言しています。
です。
コンテナとイテレーターが認識されていない?・・・
Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません
Posted: 2013年1月22日(火) 01:02
by Suikaba
コード:
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();
}
}
のほうが楽かと思われます。
あんまり質問文読めてないのと眠いのでずれてるかもしれません。ごめんなさい。
Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません
Posted: 2013年1月22日(火) 01:24
by Suikaba
一応元のコードみました。
コード:
#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
Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません
Posted: 2013年1月22日(火) 01:27
by Suikaba
C2513はググったらすぐでますので、幸運を!
【追記】
*m_EnemyContainer.Type
とはじめ書いていらっしゃったようですが、参照剥がしの*演算子よりもメンバアクセスの.演算子のほうが優先度が高いので、C2039になるんじゃないでしょうか。なので(*m_EnemyContainer).Typeと書くか、m_EnemyContainer->Typeとするかですね。
Re: 【STL】vector の情報に iteratorでアクセスする方法が分かりません
Posted: 2013年1月22日(火) 10:33
by TOMY
解決出来ました。純粋に変数名に使った”Iterator”と言う名前がアウトだっただけみたいです。
”It”に改名したら普通に使えました。
一応タイトルの部分の問題は解決したのでタグを付けさせてもらいます。
Suikaba さんが書きました:【追記】
*m_EnemyContainer.Type
とはじめ書いていらっしゃったようですが、参照剥がしの*演算子よりもメンバアクセスの.演算子のほうが優先度が高いので、C2039になるんじゃないでしょうか。なので(*m_EnemyContainer).Typeと書くか、m_EnemyContainer->Typeとするかですね。
あ、そこは最初に調べた時に出てきた方法で試しに使った部分です。 アローでうまく行かなかったので試してみたんですがやっぱりダメですよね。
タイトルの部分を解決したプロジェクトを上げておきます。