我可以使用具有与静态数组相同功能的向量吗?

时间:2013-11-29 08:54:41

标签: c++ arrays c++11 vector

只是一个快速的:

我计划拥有一个AVL树阵列(对于一项任务,正如你想象的那样 - 除了学生数据结构之外,有没有人使用AVL树?)我想知道我是否可以使用漂亮的向量 - 并利用for(auto i:vect)c ++ 11功能。

我想做什么:AVLTree 1.000.000元素的数组,所以如果树存在与否,我可以检查CONSTANT时间(数组位置是否为NULL)

AVLTree_GeeksforGeeks **AVLArray = new (AVLTree_GeeksforGeeks*)[1000000];
for(int i=0; i<1000000; i++){ AVLArray[i] = nullptr; } //init everything to null

//do stuff with AVL trees
//...

if(AVLTree[52000]!=nullptr)
{
     cout << "tree exists!\n";
}

是否有与向量的等价物,这将允许我一直搜索树的时间?我见过的所有例子都使用vector.push_back()和vector.find()来搜索。

2 个答案:

答案 0 :(得分:2)

您可以按照Exceptyon的建议使用std::vector

std::vector<unique_ptr<AVLTree>> trees(1000000);

还使用了c ++ 11中实现的智能指针。如果您关注的是动态调整大小,请记住,您可以在创建向量时(通过将其作为构造函数中的参数传递)或通过resize成员保留初始存储量。

如果您的关注是对其对象的随机访问,请放心operator[]具有O(1)复杂性。

如果您在编译时知道容器的总容量,您还可以考虑使用c ++ 11的std::array,它为每个功能提供相同的功能,并为其元素提供相同的constant time access

std::array<unique_ptr<AVLTree>, 1000000> trees;

答案 1 :(得分:1)

vector会有效,因为它们有一个重载的operator[],可以保证对第n个元素的持续时间访问。

但你的代码不清楚:

AVLTree_GeeksforGeeks *AVLArray = new AVLTree_GeeksforGeeks[1000000];
for(int i=0; i<1000000; i++){ AVLArray[i] = nullptr; } //init everything to null

如果设置为nullptr,则需要指针。指针上AVLTree_GeeksforGeekstypedef吗?我认为情况并非如此,并且存在拼写错误 - 否则您只需删除此typedef定义即可使用std::unique_ptr<TheRealTyp>。所以要澄清一下,我想你的代码确实是:

AVLTree_GeeksforGeeks **AVLArray = new (AVLTree_GeeksforGeeks*)[1000000];
for(int i=0; i<1000000; i++){ AVLArray[i] = nullptr; } //init everything to null

在这种情况下,根据建议您应该使用std::vector<std::unique_ptr<AVLTree_GeeksforGeeks>>,并且您不必将其初始化为nullptr,并且对{{1}的直接“测试”更改了无效测试}}:

std::unique_ptr

现在,如何使用std::vector<std::unique_ptr<AVLTree_GeeksforGeeks>> AVLArray(100000); // Do stuff with AVL trees if (AVLArray[52000]) { cout << "tree exists!\n"; }

  • 在已分配的区域中设置值:std::vector<std::unique_ptr<X>>
  • 将条目设置为null:AVLArray[5200] = std::unique_ptr(new AVLTree_GeeksforGeeks));
  • 如果您需要添加内容(向量将增长):AVLArray[5200].reset()
  • 迭代使用AVLArray.push_back(std::unique_ptr(new AVLTree_GeeksforGeeks));for (auto& elem: AVLArray)是强制性的,否则将调用复制构造函数,&禁止此。

这是一个例子:

std::unique_ptr