删除矢量中的重复项
Remove Duplicates in Vector?
本文关键字:删除 更新时间:2023-10-16
我有一个这样定义的顶点:
struct VERTEX
{
XMFLOAT3 Pos
XMFLOAT2 UV
};
我定义了一个索引,纹理协调索引,UVcoordinate和顶点,像这样
vector <int> indices ;
vector <int> Texcoordindex ;
vector <XMFLOAT2> UVCoinate ;
vector <XMFLOAT3> Verices;
OK。我设置索引,纹理协调索引,UVcoordinate和顶点从一个3D文件(在这种情况下是一个obj文件)。
现在当我想定义一个面数组时,我发现一些顶点是用多个UV坐标定义的。我想删除具有相同UV坐标的重复顶点,并创建新的索引和顶点向量,以仅存储具有顶点新索引的非重复顶点。
下面是obj文件:
# This file uses centimeters as units for non-parametric coordinates.
v -12.830015 0.000000 12.061520
v 12.027525 0.000000 12.061520
v -12.830015 15.862570 12.061520
v 12.027525 15.862570 12.061520
v -12.830015 15.862570 -12.622024
v 12.027525 15.862570 -12.622024
v -12.830015 0.000000 -12.622024
v 12.027525 0.000000 -12.622024
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.375000 0.500000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.875000 0.000000
vt 0.875000 0.250000
vt 0.125000 0.000000
vt 0.125000 0.250000
f 1/1 2/2 3/3
f 3/3 2/2 4/4
f 3/3 4/4 5/5
f 5/5 4/4 6/6
f 5/5 6/6 7/7
f 7/7 6/6 8/8
f 7/7 8/8 1/9
f 1/9 8/8 2/10
f 2/2 8/11 4/4
f 4/4 8/11 6/12
f 7/13 1/1 5/14
f 5/14 1/1 3/3
我希望结果是这样的
# This file uses centimeters as units for non-parametric coordinates.
v -12.830015 0.000000 12.061520
v 12.027525 0.000000 12.061520
v -12.830015 15.862570 12.061520
v 12.027525 15.862570 12.061520
v -12.830015 15.862570 -12.622024
v 12.027525 15.862570 -12.622024
v -12.830015 0.000000 -12.622024
v 12.027525 0.000000 -12.622024
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.375000 0.250000
vt 0.625000 0.250000
vt 0.375000 0.500000
vt 0.625000 0.500000
vt 0.375000 0.750000
vt 0.625000 0.750000
vt 0.375000 1.000000
vt 0.625000 1.000000
vt 0.875000 0.000000
vt 0.875000 0.250000
vt 0.125000 0.000000
vt 0.125000 0.250000
删除副本后的新顶点
f 1/1 2/2 3/3
f 4/4 5/5 6/6
f 7/7 8/8 1/9
f 2/10 8/116/12
f7/13 5/14
我尝试使用排序和唯一,但我得到编译错误:
error C2784: 'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)' : could not deduce template argument for 'const std::list<_Ty,_Ax> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const
std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const std::basic_string<_Elem,_Traits,_Alloc> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const std::vector<_Ty,_Ax> &,const std::vector<_Ty,_Ax> &)' : could not deduce template argument for 'const std::vector<_Ty,_Ax> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const std::unique_ptr<_Ty,_Dx> &,const std::unique_ptr<_Ty2,_Dx2> &)' : could not deduce template argument for 'const std::unique_ptr<_Ty,_Dx> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'VERTEX' c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C2676: binary '<' : 'VERTEX' does not define this operator or a conversion to a type acceptable to the predefined operator c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
error C1903: unable to recover from previous error(s); stopping compilation c:program files (x86)microsoft visual studio 10.0vcincludealgorithm 3559 1 Mesh_test
如果在内存使用方面没有任何限制,你可以声明一个新的vector的保留大小与你的相同,并且只放入不在这个vector中的值,使用std::find函数来确定value是否已经在你的新vector中。
std::vector newVector;
newVector.reserve( oldVector.size() );
表示旧向量的所有元素:
if( newVector.find(element))
{
if( find( newVector.begin(), newVector.end(), newVector.size() != newVector.end() )
{
newVector.push_back(element);
}
}
其他算法可以在重复的情况下将向量中的所有元素移回预览位置(此方法仅适用于排序数组-列表)
没有代码和编译器错误是不可能诊断问题的。但是,使用std::sort
和std::unique
从indices
向量中删除重复项的一个例子是:
std::sort(indices.begin(), indices.end());
vector<int>::iterator it = std::unique(indices.begin(), indices.end());
indices.erase(it,indices.end());
我不知道XMLFLOAT3
和XMLFLOAT2
类型是什么,所以可能有必要将谓词传递给std::sort
和std::unique
。
编辑:for XMFLOAT3
bool xmfloat3_lt(const XMFLOAT3 f1, const XMFLOAT3 f2)
{
if (f1.x < f2.x) return true;
if (f1.y < f2.y) return true;
if (f1.z < f2.z) return true;
return false;
}
bool xmfloat3_eq(const XMFLOAT3 f1, const XMFLOAT3 f2)
{
return f1.x == f2.x &&
f1.y == f2.y &&
f1.z == f2.z;
}
std::sort(Verices.begin(), Verices.end(), xmfloat3_lt);
vector<XMFLOAT3>::iterator it = std::unique(
Verices.begin(), Verices.end(), xmfloat3_eq);
Verices.erase(it,Verices.end());
我知道编译器的输出令人困惑,但它试图告诉你的是,它不知道如何比较两个顶点对象。你可以定义一个运算符<在你的课堂上:
struct VERTEX
{
XMFLOAT3 Pos;
XMFLOAT2 UV;
bool operator<(const VERTEX &that) const
{
// return true if you consider this vertex to be less than that vertex.
}
};
或作为全局函数
bool operator<(const VERTEX &v1,const VERTEX &v2)
{
// return true if you consider v1 to be less than v2
}
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数