我试图为我的六边形球体项目重写我在互联网上用 C# 找到的一些C++代码,但我遇到了以下代码:
if((((*ti)->m_hexA) != tileNdx) && (find(nbrs. begin(), nbrs.end(), ((*ti)->m_hexA)) == nbrs.end()))
{
nbrs.push_back(((*ti)->m_hexA));
}
我主要将其转换为 C#。我甚至构建了自己的Find<T>(List<T> list, T value)
方法,实现了与 std::find 相同的基本功能。
但是,我仍然不确定std::vector<T>::end()
的文档。文档说它返回一个迭代器,指向迭代器末尾的"占位符"插槽,并且尝试访问它将导致"未定义的行为"。这样做:
1.( 意思是在我的 C# 中,当处理与end()
元素进行比较的常规对象时,我应该只将对象与null
进行比较?
2.( 对于整数和其他基元,我应该只与 -1 等哨兵值进行比较吗?
在上面的 c++ 源代码中,nbrs 是一个 std::vector,m_hexA 是一个 int,ti 是一个结构体。
整个结构:
(find(nbrs. begin(), nbrs.end(), ((*ti)->m_hexA)) == nbrs.end())
可以使用 LinQ 用 C# 编写:
nbrs.FirstOrDefault(i => i == ti.m_hexA) == null
或
!nbrs.Any(i => i == ti.m_hexA)
其中((*ti)->m_hexA)
相当于ti.m_hexA
。