C ++:是否可以将引用用作映射中的值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++:是否可以将引用用作映射中的值?相关的知识,希望对你有一定的参考价值。

是否可以在C ++中使用引用作为标准映射容器中的值?如果不是,为什么不呢?

示例声明:

map<int, SomeStruct&> map_num_to_struct;

示例用法:

...
SomeStruct* some_struct = new SomeStruct();
map_num_to_struct[3] = *some_struct;
map_num_to_struct[3].some_field = 14.3;
cout<<some_struct.some_field;
...

我希望看到印刷成14.3 ...

答案

没有STL容器值类型必须为assignable。引用是不可分配的。 (您不能将它们分配给其他对象进行引用。)

另一答案

不,不是。不过,您可以将指针用作值类型。

另一答案

我不这样认为,如果我没记错的话,应该将引用视为指向某个元素的常量指针。但是您可以只使用指针来达到相同的效果。

另一答案

不,您不能使用引用,但可以使用指针。在您的示例中,您似乎混淆了两者。试试:

map<int, SomeStruct *> map_num_to_struct;
SomeStruct* some_struct = new SomeStruct();
map_num_to_struct[3] = some_struct;
map_num_to_struct[3]->some_field = 14.3;
cout<<some_struct->some_field;
另一答案

值类型必须是可分配的,引用不能。

无论如何都可以使用tr1 reference_wrapper

另一答案

我相信有可能,但有限制。由于稍后无法分配引用,因此您将无法在地图上调用operator []。但是,您可以调用其他各种成员函数。只要您不违反任何参考规则。例如:

// You need the instances to exist before
auto a1 = SomeStruct();
auto a2 = SomeStruct();
auto a3 = SomeStruct();

// Creating the map with an initializer list.
std::map<int, SomeStruct&> map_num_to_struct = {
    { 1, a1 },
    { 2, a2 },
    { 5, a3 }
};

// The following won't work because operator[] returns
// a reference to the value, which can't be re-assigned.
// map_num_to_struct[6] = a1;

// These will work.
map_num_to_struct.insert({6, a1});
map_num_to_struct.insert(std::pair<int, SomeStruct&>(7, a1));

// Iterating through the map.
for (auto &a: map_num_to_struct) {
    cout << a.first << ": " << a.second.some_field << endl;
}

// We can't use operator[] for indexing.
// map_num_to_struct[5].do_something();
auto a_iter = map_num_to_struct.find(5);
if (a_iter != map_num_to_struct.end()) {
    cout << a_iter->first << ": " << a_iter->second.some_field << endl;
    a_iter->second.some_field = 14.3;
    cout << a_iter->first << ": " << a_iter->second.some_field << endl;
}

我不知道新的C ++标准是否可以做到这一点,但至少可以在GCC和clang上使用。

以上是关于C ++:是否可以将引用用作映射中的值?的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个单元格中的值自动填充 x 行的代码

是否可以从同一解决方案中的另一个项目引用 VS2005 网站项目?

Chrome-Devtools代码片段中的多个JS库

Visual Studio 2019,C#代码库,是否可以更改引用的名称?

C ++中的整数可以是NaN吗?

持有C ++引用是否可以防止变量被破坏?