私は単純なWindows::Forms
GUI に取り組んでおり、STL を使用してパッケージを使用しようとすると、いくつかの問題が発生vector
しpair
ますcliext
。基本的に、基礎となるcliext::vector< cliext::pair<A, B> >
. 私は今のところ効率をまったく気にしません。そのすべてのインスタンスはほんの一握りのエントリしか保持しないので、単純な線形検索は問題になりません。
Windows::Forms
しかし、インスタンス内でこれらのマップを使用したいので、マネージド クラスにしました。問題は、マップの個々のエントリを変更する方法がわからないことです。
これが基本的なインターフェースです(簡潔にするために関数定義をここに置きます):
template<class A, class B>
ref class bimap
{
public:
typedef typename cliext::vector< cliext::pair<A, B> >::const_iterator const_it;
void Insert(const A & a, const B & b)
{
bmap.push_back(cliext::pair<A,B>(a,b));
}
bool SetInternalByLeftDirect(const A & search_for, const B & set_value)
{
for(int i = 0; i < bmap.size(); i++)
{
if(bmap[i].first == search_for)
{
bmap[i].second = set_value;
return true;
}
return false;
}
}
bool SetInternalByLeftWithIterator(const A & search_for, const B & set_value)
{
for(const_it it = bmap.begin(); it != bmap.end(); it++)
{
if((*it).first == search_for)
{
(*it).second = set_value;
return true;
}
return false;
}
}
bool SetExternalByLeft(const A & search_for, [Out] B % modify_external)
{
for(int i = 0; i < bmap.size(); i++)
{
if(bmap[i].first == search_for)
{
modify_external = bmap[i].second;
return true;
}
}
return false;
}
private:
cliext::vector< cliext::pair<A, B> > bmap;
};
どちらのSetInternal
アプローチも機能しません。イテレータのアプローチでは、「最初の左はクラス/構造体/共用体でなければなりません..もしかして->」というコンパイルエラーが表示されますが、Visual Studioはすでにそれが間違っていると言っているので、それは私には意味がありません使用 -> と使用する場合。IntelliSense では、一覧に "最初" と "2 番目" も表示されます。
直接的なアプローチも機能しません。コンパイルして実行しますが、実際にはペアの値を変更しません (true が返された場合でも!)。
さらに、実際には正常に動作するため、SetExternal 関数を含めました。bmap
これは、インデックスによるベクトルの検索が正常に機能し、条件付き onbmap[i]
が正常であり、外部変数を設定できることを示しています。
SetInternal
ベクター内の個々のペアを変更するメソッドを作成する方法について何か考えはありますか? また、bimap を外部で反復処理する方法も必要であり、const イテレータを使用したかった (つまり、const イテレータを基になる の開始と終了に返すメンバー メソッドを使用したいbmap
) が、それを外部で使用して逆参照しようとすると、 iteratorSetInternalByLeftWithIterator
上記のメソッドで反復子を逆参照しようとしたときと同じエラーが発生します。
ありがとうございました!