c++ - C++ std::find() 寻址返回向量的类函数时的意外行为
问题描述
我是一个理论问题。我有一个类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 ....
它告诉我当它实际上是ABSENT时它是PRESENT,反之亦然。
否则,如果我复制向量并在其上找到:
std::vector<std::string> vPzVars = vPatientClass[ posPz ].getVars();
if ( std::find ( vPzVars.begin(), vPzVars.end(), var_name ) == vPzVars.end() ) {
# .... rest of code ....
它的行为符合预期!这对我来说很重要……有什么线索吗?
PS:我Patient
通过它的位置来处理对象,因为它[ posPz ]
是vPatientClass
类Patient
对象的向量。
提前感谢您的任何建议!
解决方案
您的getVars
成员正在返回内部向量的副本:
std::vector<std::string> getVars()
{
return vVar;
};
因此,在您有问题的std::find
调用中,您调用Patient::getVars()
了 3 次并获得了向量的 3 个不同副本。虽然值相同,但您从中获得的迭代器begin()
彼此end()
不兼容。您可以通过引用返回您的向量:
const std::vector<std::string>& getVars() const
{
return vVar;
};
推荐阅读
- maven - 在“Maven->Update project”之后,构建路径中源文件夹的配置已更改
- java - 使用来自 RESTful Web 服务端点调用的响应,以便稍后在其他 Web 服务端点调用中使用
- excel - Excel:OR + VLOOKUP 无法检测到某些值
- java - Kotlin - 我们如何使用 getter 和 setter 访问私有财产?访问方法是否在内部调用?
- c# - 用 override 和 new 关键字覆盖 ToString()
- html - 如何在 html 模板中呈现节点 js 数据?
- python - 尽管缩进正确,但 Python 缩进错误
- swift - 在 ARKit 1.5 中重置会话时删除文本节点
- android - Android 上的硬件加速 H.264/HEVC 视频解码到 OpenGL FBO 或纹理
- python - 未找到带有参数 '('',)' 的 'update_comment' 的反向操作。尝试了 1 种模式:['comment\\/(?P
[0-9]+)$']