2016-05-10 5 views
-1

В моем коде я пытаюсь реализовать сортировку в виде корзины, и в моей реализации я попытался использовать векторы, но, к сожалению, в итоге я получаю ошибки в отношении векторных функций.Векторы в C++, сортировка ковша: ошибка сегментации

Код:

Ошибки:

bucket_sort.cpp: In function ‘int main()’: 
bucket_sort.cpp:24:12: error: request for member ‘push_back’ in ‘array.std::vector<_Tp, _Alloc>::operator[]<float, std::allocator<float> >(i)’, which is of non-class type ‘float’ 
    array[i].push_back(element); 
      ^
bucket_sort.cpp: In function ‘void bucket_sort(std::vector<float>, int)’: 
bucket_sort.cpp:36:24: error: request for member ‘push_back’ in ‘bucket.std::vector<_Tp, _Alloc>::operator[]<float, std::allocator<float> >(((std::vector<float>::size_type)bucket_index))’, which is of non-class type ‘float’ 
    bucket[bucket_index].push_back(array[i]); 
         ^
bucket_sort.cpp:40:18: error: request for member ‘begin’ in ‘bucket.std::vector<_Tp, _Alloc>::operator[]<float, std::allocator<float> >(((std::vector<float>::size_type)i))’, which is of non-class type ‘float’ 
    sort(bucket[i].begin() , bucket[i].end()); 
       ^
bucket_sort.cpp:40:38: error: request for member ‘end’ in ‘bucket.std::vector<_Tp, _Alloc>::operator[]<float, std::allocator<float> >(((std::vector<float>::size_type)i))’, which is of non-class type ‘float’ 
    sort(bucket[i].begin() , bucket[i].end()); 
            ^
bucket_sort.cpp:45:33: error: request for member ‘size’ in ‘bucket.std::vector<_Tp, _Alloc>::operator[]<float, std::allocator<float> >(((std::vector<float>::size_type)i))’, which is of non-class type ‘float’ 
    for(int j = 0 ; j < bucket[i].size() ; j++) 
           ^
bucket_sort.cpp:46:19: error: request for member ‘push_back’ in ‘array.std::vector<_Tp, _Alloc>::operator[]<float, std::allocator<float> >(((std::vector<float>::size_type)(index ++)))’, which is of non-class type ‘float’ 
    array[index++].push_back(bucket[i][j]); 
       ^
bucket_sort.cpp:46:40: error: invalid types ‘float[int]’ for array subscript 
    array[index++].push_back(bucket[i][j]); 

Отредактированный код:

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

void bucket_sort(vector<float> & , int); //vector is passed by reference 


int main(){ 

vector<float> array; 
float element; 
int count; 


cout << "\nEnter the size of the vector : "; 
cin >> count; 

cout << "\nEnter the elements into the vector : "; 

for(int i = 0 ; i < count ; i++){ 
    cin >> element; 
    array.push_back(element); 
} 

bucket_sort(array , count); 

cout << "\nSorted vector : "; 

for(int i = 0 ; i < count ; i++) 
    cout << array[i] << " "; 
} 

void bucket_sort(vector<float>& array, int count){ 

vector<float> bucket[count]; 

for(int i = 0 ; i < count ; i++){ 
    int bucket_index = count * array[i]; 
    bucket[bucket_index].push_back(array[i]); 
} 

for(int i = 0 ; i < count ; i++) 
    sort(bucket[i].begin() , bucket[i].end()); 

int index = 0; 

for(int i = 0 ; i < count ; i++) 
    for(int j = 0 ; j < bucket[i].size() ; j++) 
     array.push_back(bucket[i][j]); 

} 

Edit: я ввел поправку в отношении к push_back(), но теперь на запустив мой код, я нажал на ошибку сегментации. Какие-либо предложения?

+0

Вы пытаетесь называть 'push_back' элементом вектора, а не самим вектором. –

+0

вы не можете сделать, как 'array [i] .push_back..'. вы не пытаетесь вставить вектор, а скорее в элемент вектора, который является 'float', что дает вам ошибку. –

ответ

2

push_back есть способ vector, нет элемент. Чтобы добавить элемент (с увеличением размера вектора на 1), используйте array.push_back(123). Чтобы присвоить элемент элементу array[i] = 123.

Для того, чтобы заполнить вектор используя раскладку, вы должны сначала ее изменить размер: array.resize(count).

Сортировка, wirte sort(array.begin() , array.end()).

bucket[i][j] является полностью неправильным: bucket является одномерным вектором. Вероятно, вы хотите, чтобы bucket был vector<vector<float>>.


for(int i = 0 ; i < count ; i++){ 
    int bucket_index = count * array[i]; 
    bucket[bucket_index].push_back(array[i]); 
} 

У вас есть только count элементы в массиве bucket но попросить count * array[i] элемента.

+0

Спасибо, очень! Он успешно компилируется. –

1

У вашего кода много проблем.

Главная проблема заключается в следующем:

Вы не можете сделать это:

array[i].push_back(element); 

Вы должны сделать это вместо того, чтобы:

array.push_back(element); 

Позже вы сделать то же самое:

bucket[bucket_index].push_back(array[i]); 

Но на этот раз probabl у вам нужно просто:

bucket[bucket_index] = array[i]; 

Или, если вы хотите просто получить копию из вектора называется «массив», вы можете просто сделать:

bucket = array; 

Если вы мнение, что bucket_sort должен делать, я может дать будущие объяснения.

Наконец, я хотел бы предложить вам добавить:

using MyVector = vector<float>; 

Будет ли безопасно для вас много печатать.

Кроме того, вы можете определить функцию для использования вектора по ссылке, так как иначе он будет скопирован, и вы, вероятно, не хотите:

void bucket_sort(MyVector &array, int count); 
0

Вместо array[i].push_back(element) используйте array.push_back(element). Элемент автоматически переместится в позицию как индекс цикла.

Итак, в конце цикла массив будет иметь количество элементов по вашему желанию.

Используйте эту логику везде в коде.

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