【发布时间】:2018-12-17 00:57:27
【问题描述】:
在 C++ 中使用类似以下的内容是否常见?
template <typename T> function<void(vector<T> &)> filter1 = [ ] (vector<T> &vec){
int count = 0;
for (T t : vec){
if ( t.cost < 500 )
vec.erase(vec.begin()+count);
count++;
}
};
template <typename T> void discount(float p, vector<T> &vec){
filter1<T>(vec);
int count = 0;
for (T t : vec) {
t.cost = t.cost - t.cost * p;
vec.erase(vec.begin() + count);
vec.emplace(vec.begin() + count, t);
count++;
}
顺便说一句,我称它为 tembda,因为它是模板和 Lambda 的混合体。
【问题讨论】:
-
无论如何你都可以
remove_if(stackoverflow.com/questions/36384571/…) 为什么只使用向量?你可以比这更笼统 -
顺便说一句,你的 lambda 调用了 UB。
-
vec.erase(vec.begin() + count); vec.emplace(vec.begin() + count, t);你的意思是for(T& t : vec)并去掉那些行。 -
不,这只是可怕的 c++,而且它是错误的(基于范围的擦除是 ub。您需要使用基于迭代器的迭代并将擦除的返回值分配给迭代器)。跨度>
-
成语的出现是因为它们有一个很好的潜在原因。你这样做的原因是什么?
标签: c++