不必要的对象复制 - C++ STL
Unnecessary object copy - C++ STL
伙计们,我正在使用标准模板语言,几个月前我开始阅读更多关于它的信息,并实施一些练习。我这里有这段代码:
class Student {
// many attributes and methods here plus:
char* name; // Student name
char* courseName; // Student course name
std::string toString() { return std::string(name); }
}
std::string FindCourseName ( std::list< Student > stu, string name )
{
for ( std::list< Student >::iterator it = stu.begin();
it != stu.end();
it++ )
{
if ( (*it).toString() == name )
{
return it->courseName;
}
}
return "";
}
该练习要求:
a) 在 FindCourseName 方法中完成了多少不必要的对象创建/复制?b) 您将如何减少此副本数量?c) 您将如何优化上面的代码?
我多次阅读此代码,看不到任何不必要的对象副本,你们可以在我的脑海中放一盏灯吗?哈哈哈非常感谢!
- 由于两个函数参数按值捕获,因此
stu
和name
都是传入事物的副本。这很糟糕。 -
(*it).toString()
复制it->name
作为string
,但这值得商榷,因为string
非常方便,而且很难搞砸,所以这种事情很常见。 -
it++
返回增量之前的副本,但大多数人不计算在内,因为它的优化非常微不足道。 - 在 C++03 中,
return std::string(name);
有时可以创建名称的其他临时字符串副本。 这主要是理论上的,所以很少有人计算。 - 由于
FindCourseName
返回一个string
,它复制了返回值作为string
,但同样,这是值得商榷的,因为string
是好的。
我会根据赋值的请求按以下方式重写函数,前提是类本身不能更改,并且其所有数据成员都是私有的,除非在函数类方法中使用
std::string FindCourseName ( const std::list< Student > &stu, const string &name )
{
for ( std::list< Student >::const_iterator it = stu.cbegin(), last = stu.cend();
it != last;
++it )
{
if ( (*it).toString() == name )
{
return it->courseName;
}
}
return "";
}
如果数据成员名称是公共的,那么我会写
if ( (*it).name == name )
{
return it->courseName;
}
尽管由于优化和复制/移动构造函数消除,没有太大区别。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 使用 char 分隔符解析C++中的字符串,但将可重复的字符保留为每个解析的子字符串 (C++ STL) 中的分隔符
- 在C++中迭代 STL 集时出现奇怪的问题<CStudent>
- 如何在 C++17 STL 并行算法中处理调度?
- 在学习数据结构之前对STL有一个了解是好的吗?
- C++ STL 排序会检查 NaN 吗?