2017-02-09 6 views
1

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

#include <iostream> 
#include <string> 
#include <vector> 
#include "stdio.h" 

using namespace std; 

struct students 
{ 
string name; // I am not sure 
int roll_no; 
}; 

vector<p>& get_stud_data(vector<students> & p, int n) 
{ 
for(int i=0;i<n;i++) 
{ 
cout<<"Enter Name of " <<i+1<<"th student\n"; 
cin>> p[i].name; 
} 
return p; 
} 

int main() 
{ 

int n; 
cout<<" Enter the number of students: "; 
cin>> n; 

vector<students> p(n); // creating n objects for struct students 

    // Want to retrieve the objects here. 
    p=get_stud_data() 
    return 0; 

    } 
+0

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

ответ

0

Вам не нужно. Вы передаете в своем векторе как ссылки поэтому ваша функция может изменить его:

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

struct student 
{ 
    string name; 
    int roll_no; 
}; 

void get_student_data(vector<student>& students) 
{ 
    for(int i = 0; i < students.size() ; i++) 
    { 
    cout << "Enter Name of " << i+1 << "th student\n"; 
    cin >> students[i].name; 
    } 
} 

int main() 
{ 
    int n; 

    cout << " Enter the number of students: "; 
    cin >> n; 

    vector<student> students(n); 

    get_student_data(students); 

    // cout some students here to see it worked 

    return 0; 
} 

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

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

struct student 
{ 
    string name; 
    int roll_no; 
}; 

vector<student> get_student_data(vector<student>& students) 
{ 
    for(int i = 0; i < students.size() ; i++) 
    { 
    cout << "Enter Name of " << i+1 << "th student\n"; 
    cin >> students[i].name; 
    } 
    return students; 
} 

int main() 
{ 
    int n; 

    cout << " Enter the number of students: "; 
    cin >> n; 

    vector<student> students(n); 

    vector<student> copy = get_student_data(students); 

    // now you have the same data copied into "copy" and "students" 
    // cout some students here to see it worked 

    return 0; 
} 
+0

Я хочу вернуть вектор обратно в главную функцию, поскольку мне нужно продолжить процесс. Как вернуть вектор объектов p и поймать его в основной функции – Step

+0

@Step Вам не нужно * его вернуть, вы все еще имеете *. Это не пропало. Экземпляр с именем 'students' все еще существует и был изменен вашей функцией. – nvoigt

+0

ok col, но можно ли его вернуть. Я хочу знать, как можно вернуть векторные объекты. – Step

0

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

vector<student> get_student_data(int n) 
{ 
    vector<student> v(n); 
    for (int i = 0; i < n; i++) 
    { 
    cout << "Enter Name of " << (i+1) <<"th student\n"; 
    cin >> v[i].name; 
    } 
    return v; 
} 

Кроме того, я отметил, что в коде вы создаете вектор заданного размера n и передаете его функции для чтения ее содержимого. Итак, если вы действительно хотите создать вектор заданного размера, и пусть функция просто считывает данные студента в этом векторе, вы можете просто передать vector<student> в качестве параметра ввода/вывода (используя ссылку: vector<student>&), не указав дополнительный int n параметр, как и векторы знать свой размер (например, вы можете запросить его с vector::size):

void get_student_data(vector<student>& v) 
{ 
    for (size_t i = 0; i < v.size(); i++) 
    { 
    cout << "Enter Name of " << (i+1) <<"th student\n"; 
    cin >> v[i].name; 
    } 
}