2015-03-20 3 views
-1

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

error: cannot convert 'std::vector<int>' to "std::vector<int>*' for argument '1' to bool numInList(std::vector<int>*, int)' 

Эта ошибка возникает, когда я вызываю функцию numInList.

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

вот мой код:

#include <iostream> 
#include <string> 
#include <vector> 
#include <fstream> 
#include <cstdlib> 
#include <ctime> 


using namespace std; 
bool numInList(vector <int> randNumbers[], int num); 

const int length = 100; 

int main() 
{ 
int countCheck = 0; 
vector <int> randNumbers(length); 
vector <int> newlist(); 

srand(time(0)); 

while(countCheck < length){ 
    int num = rand() % 90000 +10000; 

    if (!numInList(randNumbers, num)){ 
     randNumbers[countCheck] = num; 
     cout << "The Random Number " << randNumbers[countCheck] << endl; 
     countCheck++; 
    } 
} 

cout << "\n\n\n"; 
newlist[] = randNumbers[]; 

return 0; 
} 
bool numInList(vector<int> randNumbers[], int num){ 
for (int index = 0; index < length; index++){ 
    if (randNumbers[index] == num){ 
     return true; 
    } 
} 
return false; 
} 

Я попытался де-реферирование в надежде, что позволит решить проблему

if (!numInList(&randNumbers, num)) 

тогда я получаю сообщение об ошибке в операторе IF в функции numInList

error: ISO C++ forbids comparisons between pointers and integer [f-permissive] 

Любая помощь была бы принята с благодарностью.


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

#include <iostream> 
    #include <string> 
    #include <vector> 
    #include <fstream> 
    #include <cstdlib> 
    #include <ctime> 


    using namespace std; 
    bool numInList(vector <int> randNumbers, int num); 

    const int length = 100; 

    int main() 
    { 
    int countCheck = 0; 
    vector <int> randNumbers; 
    vector <int> newlist; 

    srand(time(0)); 

    while(countCheck < length){ 
     int num = rand() % 90000 +10000; 

     if (!numInList(randNumbers, num)){ 
      randNumbers.push_back(num); 
      cout << "The Random Number " << randNumbers[countCheck] << endl; 
      countCheck++; 
     } 
    } 

    cout << "\n\n\n"; 
    newlist = randNumbers; 

    return 0; 
    } 
    bool numInList(vector<int> randNumbers, int num){ 
    for (int index = 0; index < length; index++){ 
     if (randNumbers[index] == num){ 
      return true; 
     } 
    } 
    return false; 
    } 
+1

'вектор randNumbers []' 'объявляет randNumbers' как массив ** из ** векторы. Или фактически, как указатель на вектор, поскольку это аргумент функции. Также 'newlist [] = randNumbers []' должен быть просто 'newlist = randNumbers'. – emlai

+0

Zenith, как бы вы объявили вектор правильно? Я попытался удалить скобки [], но я получил ту же ошибку. – bryan

+0

@bryan, Сделайте это в определении * и * функции. – chris

ответ

2

Вы должны пройти векторы вокруг по ссылке (если вы не хотите, чтобы скопировать его). Если вы не собираетесь изменять вектор, сделать его константный ссылка:

bool numInList(const vector<int>& randNumbers, int num) 

Подробнее: How to pass objects to functions in C++? (.. Это самые основы C++ Получить их прямо)

Кроме того, вы можете использовать vector::size, чтобы получить количество элементов в векторе. Таким образом, index никогда не будет превышать размер вектора, и вы не будете иметь недоступный доступа, независимо от того, что размер вектора:

for (int index = 0; index < randNumbers.size(); index++) 

Здесь я переписал все это для вы должны показать, как использовать вектор. Прочитайте его через тщательно и убедитесь, что вы понимаете, все (в том числе, почему ваш оригинальный подход был не самый лучший выбор дизайна):

int main() 
{ 
    const int length = 100; 
    vector<int> randNumbers; 
    vector<int> newList; 

    srand(time(0)); 

    while(randNumbers.size() < length){ 
    int num = rand() % 90000 +10000; 

    if (!numInList(randNumbers, num)){ 
     randNumbers.push_back(num); 
     cout << "The Random Number " << randNumbers.back() << endl; 
    } 
    } 

    cout << "\n\n\n"; 
    newList = randNumbers; 

    return 0; 
} 

bool numInList(const vector<int>& randNumbers, int num){ 
    for (int index = 0; index < randNumbers.size(); index++){ 
    if (randNumbers[index] == num){ 
     return true; 
    } 
    } 
    return false; 
} 
1

Аргумент для векторного randNumbers numInList [] эквивалентен вектор * randNumbers изменить аргумент

bool numInList(vector<int> &randNumbers, int num) 
+0

Гэри, я попробовал это. Я получаю сообщение об ошибке, которое говорит, что C++ запрещает сравнение между указателем и integer [f-permissive] ... – bryan

+0

удалить newlist [] = randNumbers []; –

+0

Я удалил все [] и(), теперь программа сработала ... Я работал с ним правильно, используя массив. Я опубликовал измененный код. – bryan

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