此矢量实现的可维护性问题

Maintainability issue with this vector implementation

我有一个关于解决问题的 right/wrong(设计)方法的问题。首先我澄清情况,然后我的解决方案,最后我的解决方案的问题。我正在用 C++ 实现它。

情况:

我执行了以下操作:

此解决方案的问题是: 该系统的正确行为完全取决于每个具有索引的对象。如果一个人处理他们的索引,就会出现错误问题,并且很难跟踪索引在哪里处理不当。

例如:对象 A 释放它的实例(通知 class y)但不删除索引,并且它继续对元素应用操作,而该索引现在已分配给另一个对象并且持有不同的实例!

所以我正在寻找更可靠的解决方案,可能是更好的数据结构。谢谢。

编辑:我认为描述最有帮助,但这里是 class 中保存数据的代码。

这些是向量。

std::vector<bool> availability;     
std::vector<X> data;    

这是方法

Y::Y() : data(1, X), availability(1, false) {

}

int Y::createNewInstance() {
    if(data.size() > 1) {
        bool indexFound = false;
        std::vector<X>::size_type chosenIndex;
        for(std::vector<X>::size_type i = 1; i < availability.size(); ++i) {
            //if true, the index is not taken, so use it!
            if (availability.at(i) == true) {
                chosenIndex = i;
                availability.at(chosenIndex) = false;
                indexFound = true;
                break;
            }
        }
        if (indexFound) {
            data.at(chosenIndex) = X;
            return chosenIndex;
        } else {
            data.push_back(X);
            availability.push_back(false);
            return availability.size() - 1;
        }
    } else {
            startTimes.push_back(X);
            availability.push_back(false);
            return availability.size() - 1;
    }
}

X Y::getDataElement(int index, bool finish) {
    if (data.size() > index && index != 0) {    
        //if finish is true, make element available for other users
        if(finish) {
            availability.at(index) = true;
        }
        return data.at(index);
    }   
}

如何使用 std::map 作为您的容器,其中键将是您的索引。在删除元素时更改索引不会有问题。您将需要编写一个类似 findFreeIndex 的函数来管理空闲索引。如果你不需要在 "free" space 中添加元素,你甚至不需要这个。您可以简单地总是在最大索引加一中添加新元素。

这个解决方案有轻微的性能损失,因为访问 map 比访问 vector 慢一点,但通常这不是问题。