查看STL容器的成员函数时,出现了一个奇怪的想法。为什么像std::vector<T>::push_back(T)
这样的函数没有(可选)返回值(迭代器或者甚至是对附加对象的引用)?我知道std::string
函数像insert
和erase
返回迭代器,但这是显而易见的原因。我认为它通常会保存经常在这些函数调用之后的第二行代码。STL容器函数返回值
我相信C的设计师++有一个很好的理由,请赐教:)
更新:我这里有包括现实世界中的代码示例它可以减少代码长度:
if(m_token != "{")
{
m_targets.push_back(unique_ptr<Target>(new Dough(m_token)));
return new InnerState(*(m_targets.back()), this);
}
如果我假定std::list::push_back
返回到所添加的元素的引用可以减少到
if(m_token != "{")
return new InnerState(*(m_targets.push_back(unique_ptr<Target>(new Dough(m_token)))), this);
。该代码有点沉重,但主要是(两组括号),由于unique_ptr
的构造函数和取消引用。也许是为了清楚起见,没有任何指针版本:
if(m_token != "{")
{
m_targets.push_back(Dough(m_token));
return new InnerState(m_targets.back(), this);
}
与
if(m_token != "{")
return new InnerState(m_targets.push_back(Dough(m_token)), this);
哇。很棒的信息,谢谢!仍然让我想知道为什么他们没有返回一个迭代器当然:)。也许是因为你可以'MyClass bar = *(myvector.push_back(functionReturningMyClass()));'并且可能与返回引用(或不是?)相同。 – rubenvb 2010-07-11 18:51:13
我想,原因是性能问题,因为那件事需要构造一个迭代器,并且复制那个迭代器,如果没有使用返回值,那么这是一个开销。 – smerlin 2010-07-11 19:01:58
会不会有任何体面的编译器优化这样的事情?可能不是什么标准委员会在看:) – rubenvb 2010-07-11 20:16:39