我有一个由一些共享指针组成的向量。我试图使用排序比较器函数根据某些标准对该向量进行排序。问题是,如果我们尝试从比较器函数内部访问向量的值;在某些地方我得到了空值。仅在共享指针的情况下才会发生这种情况。对于普通指针,我没有发现这样的问题。为什么在这种情况下我们会在向量内得到空值?
我的代码-
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)
你没有解释你的期望。如果清楚为什么您认为这是明智的,那么更容易有效地回答您的问题。
想象一下您正在整理几叠文件。你要四处移动这些文件。有时,您会从一堆中取出一个放在一边,直到您决定将其放在哪里。当您对书堆进行排序时,任何查看书堆内容的人都应该会看到丢失的文件、空白、不属于的东西等等,因为您正在对它们进行排序。
您看到的空值是排序算法尚未决定填充哪个对象的槽。当槽包含没有特殊语义的纯值时,槽在处理时将保存垃圾值。当槽包含更复杂的对象时,槽将倾向于保存一个移出的对象,该对象std::shared_ptr是测试为假的对象。