使用Vector时,C ++超出范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Vector时,C ++超出范围相关的知识,希望对你有一定的参考价值。

所以我通过将节点放入向量来创建二进制搜索树(BST)。这些节点存储3个值,用户输入int ID,用户输入int年龄和用户string输入名称。

将这些节点插入向量时,它们将按升序存储。

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

104 10鲍勃

102史蒂夫

推回第一个节点时,没有问题;但是,当试图推回第二个节点时,我得到一个向量类抛出的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();

非常感谢帮助!谢谢!

答案

执行此操作时,矢量不会调整大小: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

另一答案

std::vector除了push_back之外还有插入元素的方法。具体来说,insert占据一个位置,在那里插入新元素。 emplace甚至更好,因为你甚至不必创建一个元素来复制到向量中,你只需传递构造函数参数。

您可以找到与std::lower_bound一起插入的适当位置。

#include <algorithm>

void BST::insert()
{
    int ID;
    int AGE;
    std::string NAME;

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

    auto pos = std::lower_bound(binaryTree.begin(), binaryTree.end(), 
        [](const Node& n1, const Node& n2) { return (n1.ID > n2.ID); });

    binaryTree.emplace(pos, ID, AGE, NAME);

    std::cout << "Added! Size: " << binaryTree.size() << endl;
    std::cout << " " << std::endl;
    // start(); // dubious, see below
}

顺便说一句,你的insert方法知道start正在泄露假设,你可能以后想要改变。在start中包含所有内容会好得多,例如:

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

    for(int choice; (std::cin >> choice) && (choice != 5);)
    {   
        switch (choice)
        {
        case 1: insert(); break;
        case 3: find(); break;
        case 4: report(); break;
        }
    }
}

以上是关于使用Vector时,C ++超出范围的主要内容,如果未能解决你的问题,请参考以下文章

c ++ - 成功打印超出范围的字符串索引

C语言中 在超出ASCII代码对照表中数据时 是否先减去256 再看结果对应哪个字符的??????

循环播放页面时出错。返回对象变量或未设置块变量

C语言两个特别大的整数类型相加超出范围使用两个技巧

如何使用 mpi scatter 修复“矢量下标超出范围”?

带有while语句范围catch的if语句中的C ++错误