Объявите вектор элементов структуры C и укажите количество элементов, равное i (входное значение типа int) - PullRequest
0 голосов
/ 22 февраля 2009

Пожалуйста, посмотрите на этот код (и простите за отсутствие знаний). Это выводит ошибки, которые я не мог решить. Мне нужно объявить вектор элементов структуры C, но мне нужно, чтобы количество элементов было i (входное значение типа int).

Я также пробовал другие подходы, но во всех них я получил ошибку (не могу преобразовать C в int и т. Д.). Как я могу это сделать?

# include < iostream >
using std::cout;
using std::cin;
using std::endl;

# include < vector >
using std::vector;

struct C{
    int cor;
    vector<int>cores;

    };

    void LerVector( vector< C> &array ) ;

int main ()
{
     int n;
    bool done=false;
        bool don=false;
    vector<C>cidade;
    int i;


    while(!done){
    cout<<"Entre o número de cidades "<<endl;
    cin>>n;
    if(n>500)
    {
        cout<<endl;
        cout<<"O número máximo é 500"<<endl;
}
else
done=true;
}
n--;
while(!don){
cout<<"Entre o número de confederações"<<endl;
cin>>i;
if(i>100){
cout<<endl;
cout<<"Número máximo de 100 cidades"<<endl;

}
else {

 LerVector(  cidade) ;

don=true;
}
}


    cin.get();
    return 0;
}
//resolve...
 void LerVector( vector< C> &array ) 
  { 
    for ( size_t i = 0; i < array.size(); i++ ) 
      cin>>array[i];

  } // end function inputVector 

Ответы [ 5 ]

3 голосов
/ 22 февраля 2009

Давайте попробуем с объяснением:)

cin >> array[i];

Это пытается извлечь из cin в объект структуры C. Хорошо, поэтому ему нужен оператор >>, который фактически выполняет эту работу:

istream & operator>>(istream &is, C &c) {
    is >> c.cor; // or into whatever member 
    return is;
}

Кроме того, как уже упоминалось, вы должны сначала добавить элементы к вектору:

while(!don){
    cout<<"Entre o número de confederações"<<endl;
    ....
} else {
    cidade.resize(i); // resize to i elements
    LerVector(cidade);
    don = true;
}

В следующий раз, пожалуйста, отформатируйте текст (исправьте отступ). Мне было трудно пройти через это:)

1 голос
/ 22 февраля 2009

Какие ошибки сгенерировал ваш код?

Я также не уверен, что должен делать ваш код. В main () вы создаете вектор C. Но C также содержит вектор int. Это предназначено?

1 голос
/ 22 февраля 2009

Мне не совсем понятно, что вы пытаетесь сделать.

Однако я уже вижу одну потенциальную ошибку в нашем коде:

В LerVector вы входите со ссылкой на вектор, в котором в данный момент нет элементов, и, следовательно, имеет размер 0.

То, что вы пытаетесь сделать, это то, что если я меньше размера, вы обновляете этот элемент в массиве. Однако, когда вы начинаете, размер равен 0, так что я не думаю, что вы даже войдете в цикл ввода.

Теперь, даже если вы это сделали, поскольку вектор не инициализирован с любым размером, вы можете получить ошибку, что вы выходите за пределы. Вы должны изменить размер Rray.

0 голосов
/ 22 февраля 2009

Один из конструкторов std::vector<T> будет иметь начальный размер, и если объявлено после того, как число известно, вы можете передать его конструктору.

cin >> n;
std::vector<C> cidade(n);

Или вы можете использовать метод изменения размера для изменения размера вектора.

Или вы можете использовать метод add для расширения вектора (без явного указания размера).

Но в целом, может быть проще дать помощь с полной версией кода и более подробной информацией о том, что код пытается сделать.

0 голосов
/ 22 февраля 2009

если я угадаю, что вы хотите сделать, это должно быть так:

// First create an empty vector of C's
vector<C> cidade;

// cidade has zero elements now
// Read i from user
cin >> i;

// Resize vector to contain i elements
cidade.resize(i);

// Then go on and fill them.
int n;
for (n = 0; n < i; i++) {
  cin >> cores;
  cidade[n].cores.resize(cores);
  // now cidade[n].cores has 'cores' elements, but they are uninitialized
}
...