C ++容器集+数组功能

时间:2015-08-04 23:30:31

标签: c++ c++11 containers c++14

哪个是C ++中最好的容器 -

  • 仅存储唯一值(例如set
  • 可以在固定时间内使用索引查找这些值(例如array

我基本上需要在第一阶段进行迭代并收集所有unique元素,顺序确实无关紧要。

但是,在第二阶段,我必须提供容器中的每个元素,但只能逐个提供。由于调用者可以知道我的容器的大小,它一个接一个地提供index,这样0< idx<容器的大小。

现在,我想到的唯一解决方案是维护两个容器vectorset,我想知道是否有任何容器提供相同的容器?

class MyContainer{
  private:
   std::set<Fruits> setFruits;
   std::vector<Fruits> arrFruits; // can have indexed access

  public:
    void collectFruits(const Fruits& fruit){
       if(setFruits.find(fruit) == setFruits.end()){ 
       // insert only if it doens't contains
          setFruits.insert(fruit);
          arrFruits.push_back(fruit);
       }
     }
 };

2 个答案:

答案 0 :(得分:4)

STL的创始人亚历克斯·斯捷潘诺夫(Alex Stepanov)曾经说过&#34;尽可能使用向量。如果你不能使用矢量,重新设计你的解决方案,以便你可以使用矢量。&#34;考虑到这个好建议:

阶段1:收集独特元素

std::vector<Foo> elements;

// add N elements
elements.push_back(foo1);
...
elements.push_back(fooN);

// done collecting: remove dupes
std::sort(elements.begin(), elements.end());
elements.erase(std::unique(elements.begin(), elements.end()),
               elements.end());

阶段2:嗯,现在我们有vectork个唯一元素,具有常时索引访问权(索引为0..k-1)。

答案 1 :(得分:2)

您可以使用提升flat_set

我认为它不提供operator[]但它具有随机访问迭代器并且具有一个常量时间nth()函数,该函数返回具有特定索引的迭代器。

插入可能会使迭代器无效,但是您可以在阶段1中执行所有插入操作,然后在阶段2中执行所有索引访问,您应该没问题。