Просто чтобы дать немного другой способ сделать это, вы можете рассмотреть vector
вместо массива и прочитать данные с istream_iterator
вместе со стандартным алгоритмом:
std::vector<int> numlist;
std::remove_copy_if(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(numlist),
[](int i)->bool { return i<10 || i > 100; });
Редактировать: Полагаю, поскольку я использую лямбду C ++ 11, я мог бы также использовать C ++ 11 copy_if
, который выражает намерение чуть более прямо:
std::copy_if(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(numlist),
[](int i)->bool { return i>=10 && i<=100; });
Что касается «умного», то это вовсе не намерение, а то, что требуется, - это простое прямое выражение исходного намерения: копировать (фильтровать) данные из стандартного ввода в контейнер. Требуется немного времени, чтобы привыкнуть к идее рассматривать файлы как контейнеры (особенно такие, как std::cin
, который обычно является интерактивным), но в конечном итоге файл является последовательностью, а istream_iterator / ostream_iterator просто позволяет вам обращаться с ними как с другими последовательностями .