【发布时间】:2013-03-08 21:12:56
【问题描述】:
考虑这个例子:
std::vector<Student> students;
//poplate students from a data source
std::vector<Student> searched(students.size());
auto s = std::copy_if(students.begin(), students.end(), searched.begin(),
[](const Student &stud) {
return stud.getFirstName().find("an") != std::string::npos;
});
searched.resize(std::distance(searched.begin(), s));
我有以下问题:
- 是否可以为搜索到的向量分配内存等于初始向量?可能有 500 个不小的对象,可能没有一个满足搜索条件?有没有其他办法?
- 当复制到搜索到的向量时,它被称为复制赋值运算符,并且..显然会进行复制。如果从这 500 个对象中 400 个满足搜索条件呢? 不只是浪费内存吗?
我是一个 c++ 菜鸟,所以我可能会说些愚蠢的话。我不明白为什么要使用vector<T>,其中T 是一个对象。我会一直使用vector<shared_ptr<T>>。如果T 是像 int 这样的原始类型,我想使用vector<T> 有点直接。
我考虑了这个示例,因为我认为它非常笼统,您总是必须从数据库或 xml 文件或任何其他来源中提取一些数据。您是否会在数据访问层中使用vector<T> 或vector<shared_ptr<T>>?
【问题讨论】:
-
老实说,我会使用
std::back_inserter(searched)作为copy_if的输出迭代器,并完全放弃初始大小。 -
对大多数情况(尤其是#2)的一个很好的回应归结为一个问题,即为什么您首先要制作副本。如果可能,请完全避免复制,并使用
transform_if之类的东西来过滤和处理子集,而不仅仅是创建和存储子集。