vector<JAxis*>与map(int,JAxis*)中包含的指针变量相同,如何确保不重复删除指针?
时间: 2024-11-23 20:49:55 浏览: 17
当你有两个容器,一个是`vector<JAxis*>`(动态数组)和另一个是`map<int, JAxis*>`(关联集合),它们都包含指向`JAxis`类型的指针,并且可能存在相同的元素,为了避免在删除时重复删除某个指针,可以采取以下策略:
1. 使用迭代器:对于每个容器,你可以遍历其元素并检查是否已经在另一个容器中存在。如果找到匹配项,就在对应的容器中同时移除它。
```cpp
for (auto it1 : vector) {
if (auto it2 = map.find(it1->id); it2 != map.end()) {
// 在两个容器中同时删除指针
vector.erase(it1);
map.erase(it2);
}
}
```
这里假设`JAxis`有一个名为`id`的成员变量作为唯一标识符。
2. 使用智能指针(如unique_ptr或shared_ptr):如果你能控制`JAxis`的生命周期,可以考虑使用智能指针来管理资源,因为它们会在最后一个引用消失时自动删除。这样就不必担心手动删除的问题。
3. 删除前进行查找操作:在尝试从任何一个容器中删除之前,先在另一个容器中查找是否存在该元素。只有当确定不会重复删除时才执行删除操作。
无论哪种方法,都要确保删除操作是同步的,避免一边删除一边添加新的相同元素导致意外的结果。在实际操作时,最好加上适当的错误处理和边界检查。
相关问题
std::vector<Base*>增加变量
在C++中,`std::vector` 是一种动态数组,它可以存储任意类型的对象。如果你想在 `std::vector<Base*>`(基类指针向量)中增加一个变量,你可以按照以下步骤操作:
1. 首先,创建一个 `Base*` 类型的对象,它指向你要添加的新对象实例。假设 `Derived` 是 `Base` 的派生类:
```cpp
Derived* derivedObject = new Derived();
```
2. 然后,使用 `push_back()` 函数将该指针添加到向量的末尾:
```cpp
unorderedMap.push_back(std::make_pair(derivedObject, std::make_pair(std::vector<double>(), std::vector<int>())); // 假设你有额外的数据需要关联
```
这里,`std::make_pair()` 创建了一个包含指针和其它数据的 pair,可以根据需要替换数据。
3. 注意,由于是内存管理,别忘了在不再需要时释放对象的内存:
```cpp
// 当不再需要 derivedObject 时
delete derivedObject;
```
相关问题:
1. 如何在向量中插入已存在的对象指针?
2. 使用 `push_back()` 添加元素时,如何避免重复插入相同的指针?
3. 如果向量存储的是自定义对象,如何确保它们能被正确地比较?
objectarx二次开发自定义实体,实体数据是一个结构体tag,结构体tag中包含另外一个结构体map、一个类指针Class*、一个bool,而结构体map保存的是一个long long int数据和一个vector<wstring>.类指针class中有一个vector<class2*>, class2中包含了vector<AcGePoint3D>以及字符串、int等数据,请问如何保存读取这些数据到dwg
为了保存自定义实体及其数据到DWG文件中,您需要使用AutoCAD提供的ObjectARX API进行开发。下面是大致的步骤:
1. 定义自定义实体类,其中包含tag结构体、Class类指针、bool变量等成员变量。
```cpp
class MyEntity : public AcDbEntity
{
public:
ACDB_DECLARE_MEMBERS(MyEntity);
MyEntity();
virtual ~MyEntity();
// Overridden methods from AcDbEntity
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw* pWd);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
private:
tag m_tag;
Class* m_pClass;
bool m_bFlag;
};
```
2. 在实体类中实现`dwgOutFields`和`dwgInFields`方法,用于保存和读取实体数据到DWG文件中。
```cpp
Acad::ErrorStatus MyEntity::dwgOutFields(AcDbDwgFiler* pFiler) const
{
Acad::ErrorStatus es = AcDbEntity::dwgOutFields(pFiler);
if (es != Acad::eOk) return es;
// Write tag data
pFiler->writeInt32(m_tag.map.size());
for (auto it = m_tag.map.begin(); it != m_tag.map.end(); ++it)
{
pFiler->writeInt64(it->first);
pFiler->writeInt32(it->second.size());
for (const auto& str : it->second)
{
pFiler->writeBChunk(str.c_str(), str.size() * sizeof(wchar_t));
}
}
pFiler->writeInt64(reinterpret_cast<AcDbUIntPtr>(m_tag.ClassPtr));
pFiler->writeBool(m_tag.bFlag);
// Write Class data
pFiler->writeInt32(m_pClass->vec2.size());
for (const auto& pClass2 : m_pClass->vec2)
{
pFiler->writeBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->writeBChunk(pClass2->str.c_str(), pClass2->str.size() * sizeof(wchar_t));
pFiler->writeInt32(pClass2->n);
}
return pFiler->filerStatus();
}
Acad::ErrorStatus MyEntity::dwgInFields(AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es = AcDbEntity::dwgInFields(pFiler);
if (es != Acad::eOk) return es;
// Read tag data
int nSize = 0;
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
long long llKey = 0;
pFiler->readInt64(&llKey);
int nVecSize = 0;
pFiler->readInt32(&nVecSize);
std::vector<std::wstring> vecStr;
for (int j = 0; j < nVecSize; ++j)
{
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pBuf, &nLen);
vecStr.emplace_back(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
}
m_tag.map[llKey] = vecStr;
}
AcDbUIntPtr nPtr = 0;
pFiler->readInt64(reinterpret_cast<AcDbUIntPtr*>(&nPtr));
m_tag.ClassPtr = reinterpret_cast<Class*>(nPtr);
pFiler->readBool(&m_tag.bFlag);
// Read Class data
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
auto pClass2 = new class2;
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->readBChunk(&pBuf, &nLen);
pClass2->str = std::wstring(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
pFiler->readInt32(&pClass2->n);
m_pClass->vec2.emplace_back(pClass2);
}
return pFiler->filerStatus();
}
```
3. 在自定义实体的构造函数中初始化成员变量。
```cpp
MyEntity::MyEntity()
{
m_tag.ClassPtr = nullptr;
m_tag.bFlag = false;
m_pClass = new Class;
}
```
4. 在实体类中实现`subWorldDraw`方法,用于绘制实体。
```cpp
Adesk::Boolean MyEntity::subWorldDraw(AcGiWorldDraw* pWd)
{
// Draw entity using OpenGL
// ...
return Adesk::kTrue;
}
```
在AutoCAD中使用自定义实体时,可以使用下列代码进行创建并添加到当前图形数据库中:
```cpp
MyEntity* pEnt = new MyEntity;
AcDbObjectId objId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->addAcDbEntity(objId, pEnt);
if (es == Acad::eOk)
{
// Set entity properties
// ...
// Add entity to current space
AcDbBlockTableRecord* pBTR = nullptr;
es = acdbHostApplicationServices()->workingDatabase()->getModelSpace(pBTR, AcDb::kForWrite);
if (es == Acad::eOk)
{
es = pBTR->appendAcDbEntity(objId, pEnt);
pBTR->close();
}
}
else
{
delete pEnt;
}
```
当从DWG文件中读取自定义实体时,可以使用下列代码进行获取:
```cpp
AcDbObjectIdArray objIds;
acdbGetObjectsOfType(objIds, MyEntity::desc());
for (const auto& objId : objIds)
{
MyEntity* pEnt = nullptr;
Acad::ErrorStatus es = acdbOpenAcDbEntity(reinterpret_cast<AcDbEntity*&>(pEnt), objId, AcDb::kForRead);
if (es == Acad::eOk)
{
// Get entity properties
// ...
pEnt->close();
}
}
```
阅读全文