【问题标题】:vector doesn't work in struct矢量在结构中不起作用
【发布时间】:2011-12-30 15:02:17
【问题描述】:

我有这样的结构:

struct element{
char ulica[10];
vector<int> dane[3];
int wolne;
int w;
element *lewy, *prawy, *ojciec;
};

我正在实现一种 AVL 树。当键相同时,我需要将一些 int 值放入 dane(dane[0]、dane[1]、dane[2] 描述 3 个不同的值),所以我使用

tmp2->dane[0].push_back(number)

编辑。这是我向该向量添加值的代码,它是函数的一半,因为 secod half 是关于 AVL 中的旋转。

void wstaw_wezel(){

    element *tmp2; //tmp2 bedzie ojcem nowo wstawionego elementu
    tmp2=korzen;
    while(tmp2!=NULL){
    if(strcmp(tmp2->ulica, tmp->ulica)<0){
        if(tmp2->prawy!=NULL){
            tmp2=tmp2->prawy;
        }
        else{
            tmp->ojciec=tmp2;
            tmp2->prawy=tmp;
            cout<<"Wstawiam pod prawy "<<tmp2->ulica<<endl;
            if(tmp2->w!=0) tmp2->w=0;
            else tmp2->w=-1;
            break;
        }
    }
    else if(strcmp(tmp2->ulica, tmp->ulica)>0){
        if(tmp2->lewy!=NULL){
            tmp2=tmp2->lewy;
        }
        else{

            tmp->ojciec=tmp2;
            tmp2->lewy=tmp;
            if(tmp2->w!=0) tmp2->w=0;
            else tmp2->w=1;
            cout<<"Wstawiam pod lewy "<<tmp2->ulica<<endl;
            break;
        }
    }
    else{
        cout<<"2 bloki na tej samej ulicy"<<endl;
        for(int i=0; i<tmp2->dane[0].size(); i++) cout<<tmp2->ulica<<" "<<tmp2->dane[0][i]<<endl;
        tmp2->numery.push_back(tmp->numery[0]);
        tmp2->dane[0].push_back(tmp->dane[0][0]);
        for(int i=0; i<tmp2->dane[0].size(); i++) cout<<tmp2->ulica<<" "<<tmp2->dane[0][i]<<endl;
        tmp2->dane[1].push_back(tmp->dane[1][0]);
        tmp2->dane[2].push_back(tmp->dane[2][0]);
        tmp2->wolne+=tmp->dane[2][0];
        break;

    }
    }
    if(tmp->ojciec==NULL){
         korzen=tmp;
         return;
    }

其中 tmp2 是指向此结构的指针(我检查了它指向的地址,并且每次它都是相同的地址)。

问题出在哪里?如果我向向量添加新值,直到我执行它的循环结束。最后反而有fe。向量中的 4 个值我有一个,最后一个添加的值。 Vector不要在末尾添加新值,只是替换它。

【问题讨论】:

  • “不起作用”有点有点模糊。什么错误?
  • 你真的需要一个向量数组吗?发布描述问题的最小代码示例。
  • 请发布您提到的循环。
  • 你可能想要类似 vector dane;所以像 tmp2->dane.push_back(number)
  • 循环添加。我需要向量数组,而不是总大小为 3 的向量。

标签: c++ vector struct add


【解决方案1】:

您在其构造函数中声明 std::vector 的初始大小,因此您可以完成此操作的一种方法是:

struct element
{
    char ulica[10];
    std::vector<int> dane;
    int wolne;
    int w;
    element *lewy, *prawy, *ojciec;

    element() : dane(3) {}
};

如果不包含构造函数,向量的初始大小将为0。无论如何,要在后面添加一个元素,只需使用tmp2-&gt;dane.push_back(number);这会将number中的值添加到向量tmp2-&gt;dane 的后面,这可能会导致为向量实例分配的内存量发生变化。

更新:根据 OP 的评论,他需要三个向量,试试这个:

struct element
{
    char ulica[10];
    std::vector<std::vector<int> > dane;
    int wolne;
    int w;
    element *lewy, *prawy, *ojciec;

    element() : dane(3) {}
};

要将元素添加到向量,只需使用tmp2-&gt;dane[i].push_back(number),其中i 是要使用的向量的索引,number 是要添加到i 的新数字th 矢量,这与您在上面的代码段中使用的约定相同。

更新 2:根据下面的其他信息,我认为需要重新设计您的数据结构。您将各种组件的含义混合在一起,通过更清楚地描述数据元素和 AVL 数据结构管理的功能,您将能够更清楚地区分两者。所以试试这个。具有专门用于树节点的“值”部分的数据结构,如下所示:

struct house
{
    int house_number;
    int unique_value0;
    int unique_value1;

    house(int hn, int uv0, int uv2)
        : house_number(hn),
          unique_value0(uv0),
          unique_value1(uv1) {}
};

template <typename VALUE> struct node
{
    std::string key;
    std::vector<VALUE> values;
    int left, right;
    node<VALUE> *leftNode, *rightNode, *parentNode;
};

从这里,您创建一个根节点:

node&lt;house&gt; *root;

当你想在街道上添加房子时,node&lt;house&gt; *s,你需要做的就是

s-&gt;values.push_back(house(a, b, c));

当然,更好的选择是使用 C++ 已有的功能。也就是说,标准库中有一个名为std::multimap 的结构,它几乎可以完成您想要做的事情。在这种情况下,您可以简单地声明

std::multimap<std::string, house> myMap;

这可能不会使用 AVL 平衡。它更有可能是一棵红黑树,但一切都已为您完成。

【讨论】:

  • 没有任何改变。对于这个值:'a 1' 'a 2' 'a 3' 'a 4',a 是键,数字是由 push_back 添加的 int 打印:a 1, a 1 a 2, a 2 a 3, a 3一个 4 并且在程序结束之前在 main 中只打印一个 4。
  • 那么问题似乎不在于向量,而在于您如何使用向量的一些逻辑。因此,查看对您的问题的另一项编辑会很有用,该编辑更清楚地描述了您期望的输出以及它与您看到的输出有何不同。
  • 我可以发送一个完整的代码,但它大约是 500 行 + 一个 txt 文件。但是逻辑呢?我制作了一个向量,使用 4-5 次 push_back 然后打印整个向量。
  • 所以,我不清楚您希望从结果中看到什么。您说有问题,但您需要清楚地说明您对程序的期望是什么,以及它的实际行为与您的期望有何不同。在之前的评论中,您提供了一些输入和一些输出。这就是我正在寻找的一部分。另一部分应该描述该输出与您的期望有何不同。该输入的输出应该是什么?您只是希望输出与输入相同吗?
  • @lisek:另一件事。我真的没有在你的代码中看到你试图用三个向量来完成什么。当给定键有多个值时,为什么不能将重复项存储到单个向量中(如果您愿意,可以对其进行排序)?实际上,如果您只是将特定键的所有值存储在向量中,并且不区分单个键的多个值时,它将大大简化您的代码。总是假设会有多个值。
【解决方案2】:

struct元素怎么分配?,vector&lt;int&gt; dane[3];好像初始化成功了,但是它的内部向量没有初始化。

尝试向struct element添加一个ctor方法?

struct element 
{
    char ulica[10];
    vector<int> dane[3];
    int wolne;
    int w;
    element *lewy, *prawy, *ojciec;

    element()
    {
        dane[0] = vector<int>();
        dane[1] = vector<int>();
        dane[2] = vector<int>();
    }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2014-10-28
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多