【问题标题】:Null values found inside a vector while accessing that vector from inside a sort comparator function从排序比较器函数内部访问该向量时在向量内找到空值
【发布时间】:2023-03-29 03:51:01
【问题描述】:

我有一个包含一些共享指针的向量。我试图使用排序比较器功能根据某些标准对该向量进行排序。问题在于,如果我们尝试从比较器函数内部访问向量的值;在某些地方我得到了空值。 这只发生在共享指针的情况下。对于普通指针,我没有发现这样的问题。 在这种情况下,为什么我们在向量内得到空值?

我的代码-

class Tmp {
private :
    int a,b;
public :
    int getA() {
        return a;
    }
    int getB() {
        return b;
    }
    Tmp(int x, int y) : a(x), b(y) {}
};

int main() {
    std::shared_ptr<Tmp> t1 = std::make_shared<Tmp>(11,19);
    std::shared_ptr<Tmp> t2 = std::make_shared<Tmp>(2,3);
    std::shared_ptr<Tmp> t3 = std::make_shared<Tmp>(5,6);
    std::shared_ptr<Tmp> t4 = std::make_shared<Tmp>(3,5);

    vector<std::shared_ptr<Tmp>> v;
    v.push_back(t1);
    v.push_back(t2);
    v.push_back(t3);
    v.push_back(t4);

    auto fun = [&v] (std::shared_ptr<Tmp> &l, std::shared_ptr<Tmp> &r) -> bool {
      for (auto it : v) {
        if (!it) {
            cout<<"null value"<<endl;
        } else {
            cout<<it->getA()<<", "<<it->getB()<<endl;
        }  
      }
      cout<<"-------"<<endl;
      return (l->getA() < r->getA());
  };
  sort(v.begin(), v.end(), fun);
  return 0;
}

输出

11, 19
2, 3
5, 6
3, 5
-------
2, 3
11, 19
5, 6
3, 5
-------
2, 3
11, 19
null value
3, 5
-------
2, 3
null value
11, 19
3, 5
-------
2, 3
5, 6
11, 19
3, 5
-------
2, 3
5, 6
11, 19
null value
-------
2, 3
5, 6
null value
11, 19
-------
2, 3
null value
5, 6
11, 19
-------

【问题讨论】:

  • std::sort 改变了向量,在那工作期间看着它很奇怪......
  • 请注意这里的术语。 C++ 没有 null values 的概念。只有 pointers 可以是“null”(尽管是字符串 null 终止符)。
  • 至于你的问题,真的有问题吗? std::sort 函数没有按预期工作吗?
  • 无关:for (auto it : v) 非常令人困惑(除非您在向量中存储了迭代器)。为it 中的共享指针副本使用更好的名称。

标签: c++ sorting shared-ptr


【解决方案1】:

你没有解释你的预期。如果您清楚为什么您认为这是明智的,那么您的问题会更容易有效地回答。

想象一下,您正在整理一堆文件。你将四处移动这些文件。有时,您会从堆栈中取出一个放在一边,直到您决定将它放在哪里。 在您对它们进行排序时查看堆栈内容的任何人都应该期望看到丢失的文件、空白、不属于它的东西等等,因为您在中间对它们进行排序

您看到的空值是排序算法尚未决定要填充什么对象的槽。当插槽包含没有特殊语义的纯值时,插槽将在处理时保存垃圾值。当插槽包含更复杂的对象时,插槽将倾向于保存一个已移动的对象,对于 std::shared_ptr 来说,这是一个测试为假的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多