从排序比较器函数内部访问该向量时在向量内发现空值

1 c++ sorting shared-ptr

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

我的代码-

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;
}
Run Code Online (Sandbox Code Playgroud)

输出

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
-------
Run Code Online (Sandbox Code Playgroud)

Dav*_*rtz 7

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

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

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