оценка массива с ++ - PullRequest
       13

оценка массива с ++

2 голосов
/ 07 ноября 2011

Есть ли способ "массово оценить" содержимое массива в C ++? Например, пусть int numbers [10] = {23,42,12,42,53,10,0,0,0,0}. Есть ли способ перебрать каждый элемент в массиве и проверить, соответствует ли элемент указанному условию?

Короче, я хотел бы иметь возможность сделать что-то вроде:

if(every element in the array meets arbitrary condition)
do this

или

if(array element from m to array element n==something)
do this

Я знаю, что для небольших массивов я могу использовать что-то вроде: речь идет об оценке очень больших массивов.

Ответы [ 6 ]

3 голосов
/ 07 ноября 2011

"if (каждый элемент в массиве соответствует произвольному условию) сделать это" с STL:

bool IsOdd (int i) 
{
  return ((i%2)==1);
}
  //...
{
  vector<int> myvector;
  vector<int>::iterator it;

  myvector.push_back(2);
  myvector.push_back(4);
  myvector.push_back(6);
  myvector.push_back(8);

  it = find_if (myvector.begin(), myvector.end(), IsOdd);
  if (it == myvector.end())
    cout<< "No Odd numbers";
  }

"if (каждый элемент в массиве соответствует произвольному условию) сделать это" без STL

numbers[10]={2,4,6,8,10,12,14,16,18,20}
bool oddExist=false;
for (int i =0;i<10;++i)
  {
     if ( numbers[i]%2 )
     {                      //added
       oddExist=true;     
       break;               //added  for efficiency, was not in 
     }                      //        first post. 
  }
      if (!oddExist)
        cout<< "No Odd numbers";

"if (элемент массива от m до элемента массива n == что-то) делает это" с STL

void printNumber (int i) 
{
  cout  << i;
}

  // ... 

  vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);
  myvector.push_back(40);

  for_each (myvector.begin(), myvector.end(), printNumber);

"if (элемент массива от m до элемента массива n == что-то) делает это" без STL

numbers[10]={2,4,6,8,10,12,14,16,18,20}

for (int i =0;i<10;++i)
   cout << numbers[i];
3 голосов
/ 07 ноября 2011

вы, вероятно, имеете в виду "для"

for(int i = 0; i < size_of_array; i++)
  if( the_condition_function(numbers[i])){
     //do this
  }
2 голосов
/ 07 ноября 2011

Поскольку ваше условие состоит в том, что каждый элемент удовлетворяет условию, вероятно, более эффективно использовать алгоритм, такой как std :: find или std :: find_if .Для find_if вы можете определить функтор, который будет возвращать true, если ваше условие не выполнено, и алгоритм остановится при первом появлении вместо циклического прохождения по всему массиву.

2 голосов
/ 07 ноября 2011

Есть ли способ перебрать каждый элемент в массиве и проверить, соответствует ли элемент указанному условию?

Вы можете использовать std :: for_each алгоритм.

0 голосов
/ 07 ноября 2011

if (каждый элемент в массиве соответствует произвольному условию)
сделай это

if (std::find_if(&a[0], &a[size], testUnaryFunction) == &a[size])
{
    do this  // if all elements in i => [0-size) testUnaryFunction(a[i]) return false
}

if (элемент массива от m до элемента массива n == что-то)
сделай это

if (std::equal(&a[0], &a[size], &b[0], testBinaryFunctin))
{
    do this  // if all elements in i => [0-size) testBinaryFunctin(a[i], b[i]) returns true
}

Если у вас есть C ++ 11, вы можете использовать замыкания:

if (std::find_if(&a[0], &a[size], [](type const& val) { return val%2 == 0;}) == &a[size])
{
    do this // if all elements are odd
}

if (std::equal(&a[0], &a[size], &b[0], [](type const& lhs, type const& rhs) { return lhs == rhs;}))
{
    do this  // if arrays a and b are equal.
}
0 голосов
/ 07 ноября 2011

Просто ради компетенции:

вы также можете использовать ранжирование на основе, однако ваш компилятор уже должен реализовать эту часть версии C ++ 11.Я знаю, что Microsoft Visual C ++ (2010) не имеет.Хотя я считаю, что GCC 4+ уже есть.

int my_array[] = {2,4,6,8,10,12,14,16,18,20};
for (int &x : my_array) {
    std::cout << x << std::endl;
}

В качестве альтернативы хорошо использовать std :: for_each вместе с лямбда-функцией, но я нашел msdn : очень хорошообъяснение лямбды.

int my_array[] = {2,4,6,8,10,12,14,16,18,20};
std::for_each(my_array[0], my_array[10], [&] (int* iter) {
    std::cout << *iter << std::endl;
});

Или просто оператор for, как описано выше.

...