gpt4 book ai didi

c++ - 我应该 clear() 作为参数传入的容器,还是换入一个新对象?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:47 25 4
gpt4 key购买 nike

<分区>

我在工作中讨论如何正确处理容器作为参数。

我们有一个接受容器参数的函数,并希望返回仅填充函数放入其中的内容的容器:

class bar;

void foo(std::vector<bar> &bars)
{
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}

在讨论的一方面,有人说我们应该先 bars.clear() 然后再运行函数。

例如:

void foo(std::vector<bar> &bars) 
{
bars.clear();
//do stuff that fills bars.
//exceptions may be thrown.
//we may also legally return early
return;
}

我自己的偏好是尝试尽可能接近强异常保证,这意味着创建一个本地容器,填充它并在返回之前交换,但否则保持 bars 不变。

例如:

void foo(std::vector<bar> &bars) 
{
std::vector<bar> localBars;
//do stuff that fills localBars.
//exceptions may be thrown.
//we may also legally return early
if (returnEarly)
{
bars.swap(localBars);
return;
}
//do more stuff that may change localBars

bars.swap(localBars);
return;
}

第一个例子是“经典”方法;在做任何事情之前清除参数并从那里开始。

第二种方法,对我来说,建立了一个强大的异常保证(假设函数没有做任何其他事情可以改变内部状态),并避免了 clear() 调用。

选择一种方法相对于另一种方法有什么优点或缺点吗?

请注意,对于此功能,不需要强异常保证;如果该函数在参数中没有任何失败或它所做的任何其他事情在它到达异常处理程序时都会很重要。

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