Столько всего сказать:
int* new_array = NULL;
C ++ использует nullptr
. Т.е. int* new_array = nullptr;
Тем не менее, вы должны вставить инициализацию, которую делаете в следующей строке:
int* new_array = new int[nrValues];
Но вы только что создали новый объект в куче, который вы не delete
,Это называется утечкой памяти. В настоящее время мы используем уникальные указатели, чтобы помочь нам в этом.
std::unique_ptr<int[]> new_array = new int[nrValues];
Однако в C ++ у нас есть контейнеры STL, которые обрабатывают все вещи массива в стиле C для вас. Поскольку new_array
отличается от values
, вы, вероятно, захотите использовать std::vector
, который имеет динамический размер. Контейнеры STL имеют нечто, называемое iterators
, которое может более эффективно проходить через элемент. Однако контейнеры STL не имеют функций вывода по умолчанию, поэтому вам придется написать свои собственные.
#include<vector>
#include<iostream>
std::vector<int> getBiggerThen(std::vector<int> const& input, int givenValue) {
std::vector<int> output;
for (auto it = input.cbegin(); it != input.cend(); it++) {
if (*it > givenValue) {
output.push_back(*it);
}
}
return output;
}
std::ostream& operator<< (std::ostream& out, std::vector<int> const& vec) {
for (auto const& el : vec) out << el << " ";
return out;
}
int main() {
auto y = std::vector<int>{ 1,2,100,18,20,94 };
std::cout << getBiggerThen(y, 8) << "\n";
}
о ... также важно: в C ++ main
всегда должно возвращаться int
.
Наконец, то, что вы делаете, требуется так часто, что библиотека STL имеет встроенный алгоритм для этого. Который может уменьшить все до
#include<vector>
#include<algorithm>
#include<iostream>
int main() {
auto y = std::vector<int>{ 1,2,100,18,20,94 };
std::vector<int> output{};
int givenValue = 8;
std::copy_if(std::cbegin(y), std::cend(y), std::back_inserter(output),
[givenValue](int val) { return val >= givenValue; });
for (auto const& el : output) std::cout << el << " ";
std::cout << "\n";
}