【问题标题】:Vector of structure returns only last value结构向量仅返回最后一个值
【发布时间】:2017-03-11 15:51:57
【问题描述】:

抱歉,我无法粘贴完整的代码,但我会尽力解释问题。我有一个结构向量。我将向量传递给一个函数,该函数用结构填充向量并返回向量。但是当我尝试访问向量元素时,我只插入了最后一个元素。我认为问题出在我存储结构地址的地方,因此向量只保留最后一个值,但我不知道如何纠正这个问题。

这是我的结构:

 struct NA
 { element1;
   element2;
 };

这是我在声明向量后传递向量的方式:

Vector<NA> del;
func(del);

这是我的函数:( q 是一个具有存储过程结果的变量

 func(Vector<NA> &dels)
{  
  NA& del(*new NA);
  while(q.nextquery())
   {
     while(q.nextrow())
     {
       q.bind(del.element1);
       q.bind(del.element2);
       dels.insert(&del);
     }
    return dels.entries()
 }

【问题讨论】:

  • 请根据需要发布minimal reproducible example
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 我的公司有一些限制,我不能使用像 intellij 和 eclipse 这样的工具。如果这是java,我肯定会调试我的代码,但在这里很难,如果可能的话,希望有一个解决方案:)

标签: c++ pointers vector reference structure


【解决方案1】:
NA& del(*new NA);
while(q.nextquery())
     dels.insert(&del);

显然,您只创建了一个del 对象,但您将它多次插入同一个向量中。最后,所有向量的条目都将指向同一个对象。

您想要的可能是为向量中的每个条目创建一个新的del 对象。因此,将创建语句放在循环中。

func(Vector<NA> &dels)
{  
  while(q.nextquery())
   {
     while(q.nextrow())
     {
         NA& del(*new NA); // <-- Here
         q.bind(del.element1);
         q.bind(del.element2);
         dels.insert(&del);
     }
     return dels.entries()
 }

【讨论】:

  • 好吧,让我试试这个,我想到了这个,但这不会占用大量空间并创建许多结构指针吗?
  • @user3274263 如果这是你想要的,你必须这样做。我不知道有什么解决方法可以节省一些内存,因为我对您的整体代码了解不够。这应该暂时解决您当前的问题:)
【解决方案2】:

func() 将指向单个动态分配对象的单个指针的多个副本推送到向量中。每次循环迭代都在修改同一个对象,因此向量中的每个条目最终都会指向读取的最后一条查询记录的数据。

试试类似的方法:

func(Vector<NA> &dels) {
    while(q.nextquery()) {
        while(q.nextrow()) {
            NA *del = new NA;
            q.bind(del->element1);
            q.bind(del->element2);
            dels.insert(del);
        }
    }
    return dels.entries();
}

另一方面,为什么要将指针存储在向量中?并使用非标准向量类?将实际对象存储到标准 std::vector 类中会更安全:

void func(std::vector<NA> &dels) {
    while(q.nextquery()) {
        while(q.nextrow()) {
            NA del;
            q.bind(del.element1);
            q.bind(del.element2);
            dels.push_back(del);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 2022-01-03
    • 2013-11-02
    • 2013-12-22
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多