gpt4 book ai didi

c++ - 为什么 STL::list 复制添加到列表中的元素?

转载 作者:可可西里 更新时间:2023-11-01 15:37:39 29 4
gpt4 key购买 nike

list 的标准模板库文档说:

void push_back ( const T& x );

Add element at the end Adds a new element at the end of the list, right after its current last element. The content of this new element is initialized to a copy of x.

这些语义与 Java 语义有很大不同,让我很困惑。 STL 中是否有我遗漏的设计原则? “一直复制数据”?这让我害怕。如果我添加对对象的引用,为什么要复制该对象?为什么不只是传递对象?

这里必须有一个语言设计决策,但我在 Stack Overflow 和其他网站上找到的大部分评论都集中在异常抛出问题上,因为所有这些对象复制都可能抛出异常。如果您不复制,而只是处理引用,那么所有这些异常问题都会消失。很困惑。

请注意:在我使用的这个遗留代码库中,boost 不是一个选项。

最佳答案

STL 始终准确存储您告诉它存储的内容。 list<T>始终是 T 的列表所以一切都将按值(value)存储。如果你想要一个指针列表,使用 list<T*> ,这将类似于 Java 中的语义。

这可能会诱使您尝试 list<T&> ,但这是不可能的。 C++ 中的引用与 Java 中的引用具有不同的语义。在 C++ 中,必须将引用初始化为指向一个对象。引用初始化后,它总是指向这个对象。你永远不能让它指向不同的对象。这使得在 C++ 中不可能有引用容器。 Java 引用与 C++ 指针的关系更为密切,因此您应该使用 list<T*> , 而不是。

关于c++ - 为什么 STL::list 复制添加到列表中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12916480/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com