我正在开发一个简单的Windows::Forms
GUI,并且在尝试使用 STLvector
和pair
通过cliext
包时遇到了一些问题。基本上,我用底层实现了一个非常简单(和幼稚)的双向映射cliext::vector< cliext::pair<A, B> >
。我现在根本不关心效率,它的所有实例都只会包含少数条目,所以我的幼稚线性搜索不会成为问题。
但是,因为我想在我的Windows::Forms
实例中使用这些映射,所以我将它设为托管类。问题是我无法弄清楚如何修改地图的各个条目。
这是基本界面(为简洁起见,我将函数def放在这里):
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 甚至在列表中显示“第一”和“第二”。
直接的方法也行不通。它编译并运行,但实际上并没有修改该对的值(即使它返回 true!)。
此外,我包含了 SetExternal 函数,因为它实际上工作正常。这告诉我通过索引搜索bmap
向量工作正常,条件bmap[i]
很好,它可以设置外部变量。
关于如何编写一种SetInternal
方法来修改向量中的单个对有什么想法吗?我还需要一种在外部迭代 bimap 的方法,并且我想使用 const 迭代器(即,具有将 const 迭代器返回到底层的 begin 和 end 的成员方法bmap
)但是当我尝试在外部使用它并取消引用iterator 当我尝试在SetInternalByLeftWithIterator
上面的方法中取消引用迭代器时,我得到了同样的错误。
谢谢!