gpt4 book ai didi

C++ 如果输入 vector 与输出 vector 相同,如何修复不清除输入 vector 的错误?

转载 作者:行者123 更新时间:2023-11-30 04:03:12 26 4
gpt4 key购买 nike

我有一个有两个 vector 参数的函数。它仅从“输入 vector ”中获取一些元素,并将它们添加到“输出 vector ”。它看起来像这样:

void foo(const std::vector< MyObj >& myObjsIn, std::vector< MyObj >& myObjsOut)
{
for (size_t i = 0; i < myObjsIn.size(); i++)
{
if (myObjsIn[i].condition())
{
myObjsOut.push_back(myObjsIn[i]);
}
}
}

但是如果我给出相同的 vector 作为输入和输出(它在 vector 的末尾添加选择的元素),就会出现错误。如果我添加一个清除输出的,它也会清除输入的(对于指定的情况);所以我得到一个空 vector 。我想到了:

void foo(const std::vector< MyObj >& myObjsIn, std::vector< MyObj >& myObjsOut)
{
std::vector< MyObj > tmpObjs = myObjsIn;
myObjsOut.clear();

for (size_t i = 0; i < tmpObjs.size(); i++)
{
if (tmpObjs[i].condition())
{
myObjsOut.push_back(tmpObjs[i]);
}
}
}

但是可以将输入 vector 复制到一个临时 vector 并清除输出 vector 吗?返回输出 vector 并创建一个临时 vector 以添加所选元素是否更好?像这样:

std::vector< MyObj > foo(const std::vector< MyObj >& myObjsIn)
{
std::vector< MyObj > tmpObjs;
for (size_t i = 0; i < myObjsIn.size(); i++)
{
if (tmpObjs[i].condition())
{
tmpObjs.push_back(myObjsIn[i]);
}
}
return tmpObjs;
}

或者您建议我做什么,以修复该错误并优化我的代码?

最佳答案

如果您在问题中坚持使用单一用途功能,那么您的最终答案似乎是相当合理的。然而,另一种方法是先临时交换:

void foo(const std::vector< MyObj >& myObjsIn, std::vector< MyObj >& myObjsOut)
{
std::vector< MyObj > tmpObjs;
for (size_t i = 0; i < myObjsIn.size(); i++)
{
if (myObjsIn[i].condition())
{
tmpObjs.push_back(myObjsIn[i]);
}
}
myObjsOut.swap(tmpObjs);
}

一个可能更优雅的解决方案是利用 boost::filter_iterator ( http://www.boost.org/doc/libs/1_55_0/libs/iterator/doc/filter_iterator.html ) 然后你可以简单地在范围构造函数中使用两个过滤器迭代器到你的新 vector.

(未经测试的)代码看起来像这样(稍后我会尝试编译):

struct execute_condition
{
bool operator()(const MyObj& obj) const { return obj.condition(); }
};

std::vector filtered_objects(boost::make_filter_iterator<execute_condition>(myObjsIn.begin(), myObjsIn.end()), boost::make_filter_iterator<execute_condition>(myObjsIn.end(), myObjsIn.end()));

关于C++ 如果输入 vector 与输出 vector 相同,如何修复不清除输入 vector 的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24634797/

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