gpt4 book ai didi

c++ - 是否返回 std::list coSTLy?

转载 作者:IT老高 更新时间:2023-10-28 21:55:02 25 4
gpt4 key购买 nike

我想知道返回一个列表而不是返回一个指向一个的指针是否在性能方面代价高昂,因为如果我记得,一个列表没有很多属性(不是类似于 3 个指针吗?一个代表当前位置,一个代表开始,一个代表结束?)。

最佳答案

如果您按值返回 std::list,它不仅会复制列表头,还会复制列表中的每个项目一个列表节点。所以是的,对于一个大列表来说,它是昂贵的。

如果列表是在返回它的函数中构建的,那么您可能能够从命名返回值优化中受益,以避免不必要的复制。不过,这是特定于您的编译器的。如果列表在调用函数之前已经存在(例如,如果它是对象的成员变量),则它永远不会适用。

为了避免按值返回容器,C++ 中的一个常见习惯用法是将输出迭代器作为参数。所以而不是:

std::list<int> getListOfInts() {
std::list<int> l;
for (int i = 0; i < 10; ++i) {
l.push_back(i);
}
return l;
}

你这样做:

template<typename OutputIterator>
void getInts(OutputIterator out) {
for (int i = 0; i < 10; ++i) {
*(out++) = i;
}
}

然后调用者这样做:

std::list<int> l;
getInts(std::back_inserter(l));

通常在编译器完成内联和优化后,代码或多或少是相同的。

这样做的好处是调用者不绑定(bind)到特定的集合 - 例如,如果这对特定情况更有用,他可以将项目添加到 vector 而不是列表。如果他只需要查看每个项目一次,而不是一起查看所有项目,那么他可以通过使用他自己设计的输出迭代器以流模式处理它们来节省内存。

缺点与任何模板代码相同:实现必须在编译时对调用者可用,并且您最终可能会为模板的多个实例化提供大量“重复”的目标代码。当然,您可以在不使用模板的情况下使用相同的模式,方法是将函数指针(如果需要,加上用户数据指针)作为参数并为每个项目调用一次,或者通过定义一个带有纯虚拟成员的 IntVisitor 抽象类函数,并让调用者提供它的一个实例。

[编辑:T.E.D 在评论中指出,在不使用模板的情况下避免复制的另一种方法是让调用者通过引用传入一个列表。这当然有效,它只是给调用者的灵 active 不如模板,因此不是 STL 使用的惯用语。如果您不想要我上面描述的“这个优势”,这是一个不错的选择。然而,STL 背后的初衷之一是将“算法”(在这种情况下决定值)与“容器”(在这种情况下,值恰好存储在列表中,而不是到一个 vector 或一个数组或一个自排序集,或者只是打印出来而不存储它们)。]

关于c++ - 是否返回 std::list coSTLy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1092561/

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