2013-11-07 3 views
0

Я пытаюсь прочитать большое количество значений в векторе в определенной функции, а затем вызвать его в main, чтобы получить среднее значение. Мой readInput работает отлично. Но я считаю, моя основная функция возвращает 0, когда я cout < < values.size() ;. Почему это? Что я могу сделать, чтобы изменить это?C++ Вызывающие векторы от функции к основной

using namespace std; 
//function prototype 
int readInput(vector<int> vect); 


int main() 
{ 
vector<int> values; 
int sum, avg; 
sum = readInput(values); 

//cout << sum; 

avg = sum/values.size(); 
cout << avg; 

return 0; 
} 

int readInput(vector<int> vect) 
{ 

int count; 
int total = 0; 

ifstream inputFile("TopicFin.txt"); //open file 

if(!inputFile) 
{ 
    return 0; // if file is not found, return 0 
} 

while(inputFile >> count) //read file 
vect.push_back(count); //add to file 

for (int count = 0; count < vect.size(); count++) 
total+=vect[count]; //sum data in vector 

return total; 

} 

ответ

2

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

int readInput(vector<int>& vect); 

это говорит о вашей программе передать вектор по ссылке означает что-либо модифицированное в функции непосредственно изменяет свой вектор в основном. Если вы новичок в этом материале, посмотрите this post, объяснив разницу между ссылкой и копией.

+1

Yep, что сделал это. Не могу поверить, что я не думал об этом. Туннель видят моего друга. Спасибо. – John

0

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

Изменить подпись функции. , ,

int readInput(vector<int>& vect) 

Или (возможно, более удачливый для данного примера). ..

int readInput(vector<int> *vect) 

также изменяя вызов функции

sum = readInput(&values); 
0

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

std::vector<int> values = readInput("TopicFin.txt"); 

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

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

Насколько чтение данных в вектор, то я бы использовал пару istream_iterator с:

std::vector<int> data{std::istream_iterator<int>(infile), 
         std::istream_iterator<int>()}; 

Конечно, учитывая то, как просто это, я, как правило, интересно, стоит ли имея отдельную функцию, например, readInput.

просуммировать значения, я хотел бы использовать std::accumulate:

int total = std::accumulate(data.begin(), data.end(), 0); 
Смежные вопросы