【发布时间】:2019-07-31 22:37:26
【问题描述】:
我是一个理论问题。我有一个类Patient,其中有一个函数返回类本身的向量Patient.getVars()
class Patient {
#... rest of class ...
std::vector<std::string> vVar;
public :
void addVar( std::string var )
{
vVar.push_back(var);
}
std::vector<std::string> getVars()
{
return vVar;
};
#... rest of class ...
}
我注意到,如果我使用 std::find() 检查向量 vVar 调用类函数的元素:
if ( std::find ( vPatientClass[ posPz ].getVars().begin(), vPatientClass[ posPz ].getVars().end(), var_name ) == vPatientClass[ posPz ].getVars().end() ) {
# .... rest of code ....
当它实际上是不存在时,它告诉我它是 PRESENT,反之亦然。
否则,如果我复制向量并在其上查找:
std::vector<std::string> vPzVars = vPatientClass[ posPz ].getVars();
if ( std::find ( vPzVars.begin(), vPzVars.end(), var_name ) == vPzVars.end() ) {
# .... rest of code ....
它的行为符合预期!这对我来说很重要……有什么线索吗?
PS:我通过[ posPz ] 的位置来寻址Patient 对象,因为vPatientClass 是Patient 类对象的向量。
提前感谢您的任何建议!
【问题讨论】:
-
getVars()每次调用时都会返回一个副本。这不仅可能会很慢,而且还会导致您看到的问题。在std::find ( vPatientClass[ posPz ].getVars().begin(), vPatientClass[ posPz ].getVars().end(), var_name )中,您将迭代器传递给两个不同的 向量(同一向量的两个副本),这是不允许的。返回参考:const std::vector<std::string> &getVars() const -
所以我可以将矢量公开并直接访问它...对吗?
-
或者引用返回
-
你可以保留副本,但要事先有
auto patients = vPatientClass[posPz].getVars(); -
@HolyBlackCat 听起来像是一个答案!