自从我用C++编程以来已经有一段时间了,从python回来后,我感觉自己穿着一件笔挺的夹克,好吧,我不会咆哮。
我有几个函数充当“管道”,接受一个列表作为输入,返回另一个列表作为输出(基于输入),
这在概念上是这样的,但实际上,我使用std::vector
来表示列表,这可以接受吗?
此外,我没有使用任何指针,所以我使用std::vector<SomeType> the_list(some_size);
作为变量,并直接返回它,即return the_list;
到目前为止一切都还好,项目规模很小,这似乎不会影响性能,但我仍然想得到一些关于这方面的输入/建议,因为我感觉我是在用C++编写python。
发布于 2009-02-05 07:33:06
我能看到的唯一一件事就是你强行复制了你返回的列表。这样做会更有效率:
void DoSomething(const std::vector<SomeType>& in, std::vector<SomeType>& out)
{
...
// no need to return anything, just modify out
}
因为您传入了想要返回的列表,所以避免了额外的副本。
编辑:这是一个旧回复。如果您可以使用具有move语义的现代C++编译器,则不必担心这一点。当然,如果你要返回的对象没有移动语义,这个答案仍然适用。
发布于 2009-02-05 09:51:28
如果你真的需要一个新的列表,我会简单的返回它。在大多数情况下,返回值优化将不会处理不必要的副本,并且您的代码将保持非常清晰。
也就是说,获取列表并返回其他列表确实是C++中的python编程。
对于C++来说,更合适的范例是创建接受一系列迭代器并改变底层集合的函数。
例如:
void DoSomething(iterator const & from, iterator const & to);
(迭代器可能是一个模板,这取决于你的需求)
然后,链接操作就是在begin(),end()上调用连续的方法。如果你不想改变输入,你可以先自己复制一份。
std::vector theOutput(inputVector);
这一切都来自于C++的“不要为你不需要的东西付费”的哲学,你只会在你真正想要保留原件的地方创建副本。
发布于 2009-02-05 12:26:59
我会使用通用的方法:
template <typename InIt, typename OutIt>
void DoMagic(InIt first, InIt last, OutIt out)
{
for(; first != last; ++first) {
if(IsCorrectIngredient(*first)) {
*out = DoMoreMagic(*first);
++out;
}
}
}
现在你可以调用它了
std::vector<MagicIngredients> ingredients;
std::vector<MagicResults> result;
DoMagic(ingredients.begin(), ingredients.end(), std::back_inserter(results));
您可以轻松地更改使用的容器,而无需更改使用的算法,而且返回容器也不会产生任何开销。
https://stackoverflow.com/questions/514908
复制相似问题