为什么map使用运算符[]创建新条目
Why does map create new entries with operator[]
我是c++的新手,有一个简单的程序,如下所示
#include <iostream>
#include <map>
#include <vector>
using namespace std;
int main()
{
std::map<std::string, double*> testMap;
std::vector<std::string> v = {"A", "B", "C"};
for(size_t i=0;i<v.size();++i)
{
std::string sym = v[i];
double* d = testMap[sym];
if(!d) continue;
cout << "this";
}
for(std::map<std::string, double*>::iterator itr=testMap.begin();itr!=testMap.end();++itr)
{
cout << itr->first << " " << itr->second << std::endl;
}
return 0;
}
其O/p为
sh-4.3$ main
A 0
B 0
C 0
我的问题是为什么map要创建带有空双指针的新元素
这是std::map::operator[]
:的预期行为
返回对映射到等价于的键的值的引用键,如果该键不存在则执行插入。
如果执行插入,则映射的值被值初始化(默认为类类型构造,否则初始化为零)和则返回对它的引用。
对于double*
,零初始化值是一个空指针。
您可以修改std::map::operator[]
:插入的值
testMap[sym] = ...something...;
或通过std::map::insert
:指定密钥和值
testMap.insert({sym, ...something...});
编写testMap[sym]
时,将检查映射中是否存在sym
,如果存在,则返回对它的引用。如果没有,则初始化的新条目值将插入到具有关键字sym
的映射中,在您的情况下,它是一个空指针。
所以,如果您不想拥有null值,请使用std::map::find检查密钥是否存在,并与std::map::end()
进行比较,而不是使用std::map::operator[]
我的问题是为什么map会创建带有空双指针的新元素
这就是标准如何定义std::map::operator[]的行为
n4140 23.4.4.3地图访问
T&operator[](const key_type&x);
效果:如果贴图中没有等效于x的关键帧,则插入value_type(x,T())。
和:
T&operator[](key_type&&x);
效果:如果映射中没有等效于x的键,则将value_type(std::move(x),T())插入地图。
这就是地图的工作方式。必须检查地图上的钥匙是否全部装好。使用find(键)。在您的示例testMap[sym]中;创建一个新条目。
std::map<std::string,double*>::iterator it;
it = testMap.find("A");
if ( it == testMap.end() )
{ // create a new entry
testMap["A"] = new double(1.0);
}
比赛乐趣Hilko
- C++:继续创建新的变量可以吗
- Qt:当QListView获得新条目时,如何更新QStringList
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 重用对象与创建新对象
- C++,创建新对象时类的对象更改
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 我可以动态创建新地图并作为函数参数传递吗?
- 在C++中创建新的类型特征
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- 替换现有条目并在 std::map 中添加新条目
- 为什么我的类节点覆盖自身而不是创建新的节点对象
- 从文件中读取多行.txt字符串删除空格并创建新文件进行输出
- 无法在 Visual Studio 中创建新项目
- 使用 OpenCV C++ 每 1 分钟创建新的视频文件
- 在不创建新节点的情况下实现带有映射的trie
- 如何在不创建新配置的情况下对两个不同解决方案使用的一个项目使用不同的 #defines
- 创建新对象并立即为其设置属性时出现编译器错误
- 使用 libgit2 从另一个分支创建新的 git 存储库?
- 为什么map使用运算符[]创建新条目
- 使用+=运算符可以安全地使用[]创建新的std::map条目