下面的代码似乎总是遵循真正的分支。
#include <map>
#include <iostream>
class TestClass {
// implementation
}
int main() {
std::map<int, TestClass*> TestMap;
if (TestMap[203] == nullptr) {
std::cout << "true";
} else {
std::cout << "false";
}
return 0;
}
它是为指向的未初始化指针定义的行为nullptr
,还是我的编译器的工件?
如果没有,如何确保以下代码的可移植性?目前,我正在使用类似的逻辑来为 a 返回正确的单例实例log file
:
#include <string>
#include <map>
class Log {
public:
static Log* get_instance(std::string path);
protected:
Log(std::string path) : path(path), log(path) {};
std::string path;
std::ostream log;
private:
static std::map<std::string, Log*> instances;
};
std::map<std::string, Log*> Log::instances = std::map<std::string, Log*>();
Log* Log::get_instance(std::string path) {
if (instances[path] == nullptr) {
instances[path] = new Log(path);
}
return instances[path];
}
一种解决方案是使用与此类似的方法,其中您使用特殊功能在检查时提供默认值map
。但是,我的理解是,这会导致查找的复杂性O(n)
变为O(1)
. 在我的场景中这不是什么大问题(只有少数日志),但更好的解决方案是强制类型指针默认Log*
引用nullptr
,从而使查找检查O(1)
和可移植性相同时间。这可能吗?如果可以,我该怎么做?