Я возьму на себя смелость переписать код:
class ByReference: public std::unary_function<bool, DistanceNode>
{
public:
explicit ByReference(const Reference& r): mReference(r) {}
bool operator()(const DistanceNode& node) const
{
return node.getReference() == r;
}
private:
Reference mReference;
};
typedef std::vector< std::vector<DistanceNode> >::iterator iterator_t;
for (iterator_t it = dl.begin(), end = dl.end(); it != end; ++it)
{
it->erase(
std::remove_if(it->begin(), it->end(), ByReference(tmp)),
it->end()
);
}
Почему?
- Первый цикл (
externIterator
) перебирает полный спектр элементов, никогда не изменяя сам диапазон, это то, что for
для, таким образом, вы не будете забывать увеличивать (по общему признанию for_each
будет лучше, но синтаксис может быть неудобным)
- Вторая петля сложна: просто говоря, вы фактически разрезаете ветку, на которой вы сидите, когда вы вызываете
erase
, что требует прыжка вокруг (с использованием возвращаемого значения). В этом случае операция, которую вы хотите выполнить (очистка списка в соответствии с определенными критериями), является именно тем, к чему предназначена идиома remove-erase
.
Обратите внимание, что код может быть убран, если в нашем распоряжении имеется настоящая лямбда-поддержка. В C++ 0x мы бы написать:
std::for_each(distanceList.begin(), distanceList.end(),
[const& tmp](std::vector<DistanceNode>& vec)
{
vec.erase(
std::remove_if(vec.begin(), vec.end(),
[const& tmp](const DistanceNode& dn) { return dn.getReference() == tmp; }
),
vec.end()
);
}
);
Как вы можете видеть, мы не видим ни итератор приращением/разыменования Осуществляющ больше, все это завернутые в специальных алгоритмов, которые гарантируют, что все обрабатывается соответствующим образом.
Я дам вам, что синтаксис выглядит странно, но я думаю, это потому, что мы еще не привыкли к этому.
Это не причина ошибки, но вы должны использовать pre-increment для продвижения итераторов - ++ InterIterator. – markh44
Не то, чтобы это действительно важно для производительности, оно оптимизировано большинством компиляторов. –