C++ 访问std::shared_ptr<;标准::地图<&燃气轮机&燃气轮机;不使用;获得;

C++ 访问std::shared_ptr<;标准::地图<&燃气轮机&燃气轮机;不使用;获得;,c++,shared-ptr,stdmap,C++,Shared Ptr,Stdmap,我认为这是一个标准的问题,但我仍然找不到解决方案。我可能遗漏了一些非常基本的东西 我所要做的就是访问std::shared\u ptr中的数据(只读)。 我能找到的唯一方法是实际获取共享指针下的对象,并将其用作普通对象: shared_ptr<map<int, int>> tmap = make_shared<const map<int,int>>(initializer_list<std::map<int,int>

我认为这是一个标准的问题,但我仍然找不到解决方案。我可能遗漏了一些非常基本的东西

我所要做的就是访问
std::shared\u ptr
中的数据(只读)。 我能找到的唯一方法是实际获取共享指针下的对象,并将其用作普通对象:

shared_ptr<map<int, int>> tmap = 
       make_shared<const map<int,int>>(initializer_list<std::map<int,int>::value_type>{{1, 1}});
auto someMap = *(tmap.get());
cout << someMap[1];
shared\ptr tmap=
使共享(初始值设定项列表{{1,1}});
auto someMap=*(tmap.get());

cout
shared\u ptr
支持指针语义,因此您可以使用
*
->
来访问,而不是使用
get
<代码>获取
通常在大多数生产代码中都是避免的,因为它返回原始指针。顺便说一句,您还可以/应该像检查原始指针一样检查
shared\u ptr
是否为空。

我想我要找的API是
at()
,因为我可以直接在指针上使用此API(不管映射是否为常量)

auto&someMap=*(tmap.get());//获取对映射的引用,而不是复制。
试一试{
//使用引用可以修改非常量映射
//或者使用“at”api访问不带[]运算符的元素。

Cux<代码> STD::MAP: [代码]>代码>为非const,因此不能调用<代码> const map < /Cord>对象。如果您想调用它在“代码< tmap >代码> >的地图上,从它的类型中删除<代码> const <代码>,然后编写<代码>(*tmap)[1 ] < /代码>,请考虑<代码> TMAP> > AT(1)。
-如果在
映射中找不到该键,将引发异常。这是否回答了您的问题?
auto-someMap=*(tmap.get());
复制
映射
。为了避免这种情况,请使用引用:
const-auto&someMap=…
。但正如其他人所说,
操作符[]
常量映射上不起作用,因此请删除
常量。
auto& someMap = *(tmap.get()); // get the reference to the map instead of copy.
try {
    // either use reference to be able to modify the non-const map
    // or use the "at" api to access the element without [] operator.
    cout << someMap[1] << tmap->at(2);
} catch (const std::out_of_range& oor) {
    cout << "Out of Range error: " << oor.what() << endl;
}