容器具有唯一元素和索引访问

时间:2014-10-07 07:02:28

标签: c++ stl containers

似乎不清楚我到底想要什么,所以我重写了这个问题

有些容器中每个元素都是唯一的(例如setmap),但是那些我无法通过索引访问元素(例如从容器中获取单个对象),就像这个:

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";
}

每次添加对象时,确实遍历整个容器可能很昂贵,所以我想知道是否有更好的解决方案。

1 个答案:

答案 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::unordered_set

  • 更改std::set可以降低插入复杂度
  • 通过索引访问元素很快(O(1)复杂度)。

    请注意,基于std::map<unsigned, OBJ>的解决方案会更简单,但在这方面会更慢。

  • 代码不太复杂

但当然你为了速度而牺牲记忆力。