似乎不清楚我到底想要什么,所以我重写了这个问题
有些容器中每个元素都是唯一的(例如set,map),但是那些我无法通过索引访问元素(例如从容器中获取单个对象),就像这个:
std::set<Object> set {obj1, obj2};
Object o = set[0]; // does not work
因此,要拥有一个只能存储唯一元素的索引功能访问的容器(例如vector),我必须手动确保容器中的所有元素都是唯一的,如下所示:
std::vector<Object> vec { ... }; // vector with some objects
// adding an object
if (std::count(vec.begin(), vec.end(), obj) == 0) {
vec.push_back(obj);
} else {
std::cout << "object already in container!\n";
}
每次添加对象时,确实遍历整个容器可能很昂贵,所以我想知道是否有更好的解决方案。
答案 0 :(得分:0)
您可以创建自己的容器。类似的东西:
#include <cassert>
#include <iostream>
#include <set>
#include <vector>
template<class OBJ>
class idx_set
{
public:
// ...
bool insert(const OBJ &o)
{
if (set_.find(o) == set_.end())
{
set_.insert(o);
vect_.push_back(o);
return true;
}
return false;
}
const OBJ &operator[](unsigned i) const { return vect_[i]; }
// ...
private:
std::set<OBJ> set_;
std::vector<OBJ> vect_;
};
int main()
{
idx_set<int> im;
assert(im.insert(10));
assert(im.insert(12));
assert(!im.insert(10));
std::cout << im[0] << im[1] << std::endl;
return 0;
}
添加新元素(O(logN)复杂度)不会改变现有元素的索引。
std::set
可以降低插入复杂度
通过索引访问元素很快(O(1)复杂度)。
请注意,基于std::map<unsigned, OBJ>
的解决方案会更简单,但在这方面会更慢。
但当然你为了速度而牺牲记忆力。