【发布时间】: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