在我的程序中,我有一个STL集。
set<string> myStrings;
为了提高代码的效率,我把它改为hold,只有指针。 (我不需要存储实际的字符串副本。)
set<string*> myStrings;
我已经读过,在可能的情况下用指针替换指针是一个好习惯。 (当然,仅当不需要指针的实际功能时。)
set<string&> myStrings;
但后者给了我很多编译器错误。 为什么不能将引用用作容器元素?
答案 0 :(得分:45)
容器存储对象。引用不是对象。
C ++ 11规范明确指出(§23.2.1[container.requirements.general] / 1):
容器是存储其他对象的对象。
答案 1 :(得分:11)
与“为什么”没有直接关系,但为了回答这样做的隐含愿望,我要提到c ++ 11标准库有std::reference_wrapper来启用它。它可以隐式转换为引用,并且可以存储在标准容器中。
答案 2 :(得分:2)
由于容器存储对象和引用不是对象。如果你是在c ++ 11,你可以使用std :: reference_wrapper将事物包装到可分配的对象。
http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
std :: reference_wrapper是一个类模板,它在可复制的可分配对象中包装引用。它经常被用作在标准容器(如std :: vector)中存储引用的机制,它通常不能保存引用。