2015-04-26 3 views
-2

Я застрял на одной части моего задания. Я не знаю, что такое массив C-style. Когда я сортирую обычный массив, функция сортировки работает. Тем не менее, я получаю красное squiggly в моем коде, где я пытаюсь сортировать массив C-style. Есть ли что-то, что я делаю неправильно? Поблагодарили бы за любую помощь. Заранее спасибо.Сортировка массива C-стиля

// Goal: To populate a C-style array of 40 million elements with random values between 
    //   1 and 4 billion and then sort via sort() algorithm. Note that you should use the new 
    //   operator to allocate the array. 

    // NOTE: The array is created/initialized with with 40 million elements using new operator. 

    start_time = time(NULL); // record start time 

    { 

     size_t *a1 = new size_t[forty_million]; 

     for (int i = 0; i < forty_million; ++i) 
     { 
      a1[i] = randomInt(engine); 
     } 

     sort(a1.begin(), a1.end()); 

    } 

    end_time = time(NULL); // record end time 
    total_time = end_time - start_time; // calculate time to compute 
    cout << "It took " << static_cast<long>(total_time) << " seconds to compute Part " << part++ << "\n" << endl; 
+2

Что вы имеете в виду «я получаю красной волнистой», и где именно вы получите, что «красной волнистой» ??? –

+0

Вызывает ли ваш компилятор ошибку при попытке создать код? Просто потому, что ваша среда IDE говорит, что ошибка не означает, что на самом деле она есть. Если вы получаете ошибку компилятора, вы должны отредактировать сообщение и включить его там. –

+0

* Нет, подождите ... Сделайте это «пятьдесят миллионов»! * – Sebivor

ответ

1

Я не уверен, что вы имеете в виду red squiggly line, но я думаю, ваш IDE выделяет определенную часть вашего кода, указывающего, что это не может быть правильным. Исходя из вашего вопроса, моя догадка, ваша ошибочная линия

sort(a1.begin(), a1.end()); 

и, возможно, потому, что a1 не является контейнером. Это рассуждение отдает предпочтение вашей ссылке на массив терминов C-Style.

C-style массив является реализацией нестандартной библиотеки однородного набора элементов, которые смежны в памяти.

Такие массивы не являются объектами чисто терминологии объектно-ориентированных и не имеют методов (функций-членов в C++) и свойств (членов данных на C++).

Естественно, вы не сможете выполнить вызов метода для извлечения итераторов начала и конца, указывающих начало и конец массива.

К счастью, есть несколько путей выхода

  1. Если Вы используете C++ 11 и за ее пределами, вы можете использовать свободные постоянные функции std::begin и std::end вместо вызова функций-членов

    sort(std::begin(a1), std::end(a1)); 
    
  2. Если размер массива известен, вы можете добавить его в массив, чтобы получить конец массива.

    sort(a1, a1 + sizeof(a1)/sizeof(a1[0])); 
    

    или даже лучше

    template < typename Ty, size_t N > 
    size_t countof(Ty (& arr)[ N ]) 
    { 
        return N; 
    } 
    ................. 
    sort(a1, a1 + N); 
    
+0

Возможно, вы могли бы ввести свой ответ, указав, что «красная строка squiggly», вероятно, обозначает ошибку и работает оттуда, добавив «и это, вероятно, то, что сообщение об ошибке сообщит вам» где-то в вашем текущем ответе. – Sebivor

+1

@undefinedbehaviour: Я не уверен, как я мог это сделать, хотя я старался изо всех сил дать небольшое представление (см. Мое редактирование). – Abhijit

+0

У вас есть опечатка в 1), вы хотите 'std :: begin (a1)', а не 'std :: begin (a1.begin)'. 'std :: begin/end' будет работать только с массивами, но не с указателями. – vsoftco

Смежные вопросы