Почти со всем кодом, который я пишу, я часто сталкиваюсь с проблемами сокращения наборов в коллекциях, которые в конечном итоге заканчиваются наивными условиями «если» внутри них. Вот простой пример:
for(int i=0; i<myCollection.size(); i++)
{
if (myCollection[i] == SOMETHING)
{
DoStuff();
}
}
С функциональными языками я могу решить проблему, уменьшив коллекцию до другой коллекции (легко), а затем выполнить все операции с моим сокращенным набором. В псевдокоде:
newCollection <- myCollection where <x=true
map DoStuff newCollection
И в других вариантах C, таких как C #, я мог бы сократить с помощью предложения where, например
foreach (var x in myCollection.Where(c=> c == SOMETHING))
{
DoStuff();
}
Или лучше (по крайней мере, на мой взгляд)
myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
По общему признанию, я много смешиваю парадигмы и стиль, основанный на субъективном мнении, но я не могу не чувствовать, что мне не хватает чего-то действительно фундаментального, что позволило бы мне использовать этот предпочтительный метод с C ++. Может ли кто-нибудь просветить меня?
if
внутренняя часть, которую for
вы упомянули, не только в значительной степени функционально эквивалентна другим примерам, но также, вероятно, во многих случаях будет быстрее. Также для тех, кто утверждает, что любит функциональный стиль, то, что вы продвигаете, кажется, идет вразрез с очень любимой концепцией чистоты функционального программирования, поскольку DoStuff
явно имеет побочные эффекты.
std::copy_if
, но выбор не ленив