只是一个快速的:
我计划拥有一个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()来搜索。
答案 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_GeeksforGeeks
是typedef
吗?我认为情况并非如此,并且存在拼写错误 - 否则您只需删除此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>>
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