gpt4 book ai didi

使用 Vector 时 C++ 超出范围

转载 作者:行者123 更新时间:2023-11-28 01:34:04 25 4
gpt4 key购买 nike

因此,我通过将节点放入 vector 中创建了二叉搜索树 (BST)。这些节点存储 3 个值,一个用户输入的 int ID,一个用户输入的 int 年龄,以及一个用户输入的 string 名称。

将这些节点插入到 vector 中时,它们按升序存储。

目前我正在使用两个节点。

104 10 鲍勃

102 11 史蒂夫

推回第一个节点时,没有问题;然而,当试图推回第二个节点时,我收到了 vector 类抛出的 out_of_bounds 错误。

我认为在尝试切换这两个节点的位置时我的插入函数出了点问题,但是我无法确切地说出问题出在哪里。

#include "BinaryTree.h"
#include <string>
#include <iostream>
#include <vector>

using namespace std;
int index;

struct Node
{
int ID;
int age;
string name;

Node()
{

}

Node(int id, int Age, string nm)
{
this->ID = id;
this->age = Age;
this->name = nm;
}
};

vector<Node> binaryTree;


BST::BST()
{

}



void BST::start()
{
int choice;


cout << "What would you like to do?" << endl;
cout << "1. Add a node to the tree" << endl;
cout << "2. Delete a node from the tree" << endl;
cout << "3. Find a node in the tree" << endl;
cout << "4. Report the contents of the tree" << endl;
cout << "5. Exit program" << endl;

cin >> choice;

if (choice == 1)
{
insert();
}

if (choice == 3)
{
find();
}

if (choice == 4)
{
report();
}


}


void BST::insert()
{

int ID;
int AGE;

string NAME;

cout << "Please enter the ID number, age and name" << endl;
cin >> ID >> AGE >> NAME;

Node *tree = new Node(ID, AGE, NAME);

if (index == 0)
{
binaryTree.push_back(*tree);
index++;
}

if (index > 0)
{
if ((binaryTree.at(index - 1).ID) < ID)
{
binaryTree.push_back(*tree);
index++;
}
}


if (index > 0)
{
if ((binaryTree.at(index - 1).ID) > ID)
{
Node *temp = new Node();
*temp = binaryTree.at(index - 1);
binaryTree.at(index - 1) = *tree;

binaryTree.at(index) = *temp;
index++;
}
}

cout << "Added! Size: " << binaryTree.size() << endl;
cout << " " << endl;
start();

非常感谢您的帮助!谢谢!

最佳答案

执行此操作时,您的 vector 不会调整大小:binaryTree.at(index) = *tree;

执行 push_back() 然后尝试排序

binaryTree.push_back(*tree;)
std::sort(binaryTree.begin(),binaryTree.end(),[](const Node& n1, const Node& n2){//do your comparations});

或者简单地使用 std::set

如果你想在不崩溃的情况下使用 std::vector,那么你的 insert() 必须看起来像这样:

void BST::insert()
{
int ID;
int AGE;

string NAME;

cout << "Please enter the ID number, age and name" << endl;
cin >> ID >> AGE >> NAME;

//Node *tree = new Node(ID, AGE, NAME); // Don't use new here, there is no need in this
Node tree(ID, AGE, NAME);

binaryTree.push_back(tree);
std::sort(binaryTree.begin(), binaryTree.end(), [](const Node& n1, const Node& n2)
{
//compare your nodes here
return (n1.ID > n2.ID);
});

cout << "Added! Size: " << binaryTree.size() << endl;
cout << " " << endl;
start();
}

但这不会是二叉树。您需要其他数据结构来创建二叉树,std::vector 不能是二叉树。有一个现成的解决方案,请查看 std::set,它会根据需要插入元素,您需要将自定义比较函数添加到 std::set一切都会好起来的。这是为您准备的 std::set 示例:

class Node
{
public:
Node(int id):ID(id){}
int ID;
};

class NodeComparator
{
public:
bool operator()(const Node& n1,const Node& n2)
{
return n1.ID < n2.ID;
}
};

int main()
{
std::set<Node, NodeComparator> set1;
set1.insert(10);
set1.insert(8);
set1.insert(14);
set1.insert(2);

return 0;
}

这是你需要的,std::set 升序排列: enter image description here

关于使用 Vector 时 C++ 超出范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com