Доступ к векторам в C ++ - PullRequest
1 голос
/ 26 января 2011

Я написал простую программу, которая обращается к файлу с именем input.txt и помещает его содержимое в вектор строкового типа.

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

int main()
{
    fstream input;
    input.open("input.txt");
    string s;
    input >> s;
    while (!input.eof())
    {
        cout << s <<endl;
        input >> s;
        vector<string> v;
        v.push_back(s);
    }
    input.close();

}

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

Ответы [ 3 ]

4 голосов
/ 26 января 2011

Для начала, вот гораздо более чистая версия кода, который вы только что написали:

ifstream input("input.txt");
string s;
while (input >> s) {
    cout << s << endl;
    vector<string> elems;
    elems.push_back(s);
}

Здесь используется ifstream вместо fstream, что здесь уместно, поскольку вы не используете средства записи fstream. Он также сочетает в себе логику чтения с условием цикла, упрощая логику для продолжения.

Одна вещь, которая кажется странной в этом коде, это то, что вы выбрали vector так, чтобы он работал только для одной итерации цикла. Следовательно, при каждой итерации вы теряете все старое содержимое vector. Удаление этого из цикла, вероятно, исправит это:

ifstream input("input.txt");
vector<string> elems;

string s;
while (input >> s) {
    cout << s << endl;
    elems.push_back(s);
}

Наконец, если вы хотите зациклить элементы vector, складывая их вместе, вы, вероятно, не хотите читать файл как строки, а скорее как int s или double s. Это избавит вас от необходимости конвертировать значения позже. Например:

ifstream input("input.txt");
vector<double> elems;

double s;
while (input >> s) {
    cout << s << endl;
    elems.push_back(s);
}

Теперь вы можете сложить все значения следующим образом:

double total = 0.0;
for (int i = 0; i < elems.size(); ++i)
    total += elems[i];

Или, что еще лучше, вы можете сложить все вместе, используя алгоритм accumulate из <numeric>:

double total = accumulate(elems.begin(), elems.end(), 0.0);

Надеюсь, это поможет!

2 голосов
/ 26 января 2011

Ваша программа неверна.Вероятно, вы имели в виду следующее:

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

int main()
{
    ifstream input("input.txt");
    string s;
    vector<string> v;
    while (input >> s)
    {
        cout << s <<endl;
        v.push_back(s);
    }
}

Кроме того, вот еще один способ сделать то же самое:

#include<algorithm>
#include<iterator>
#include<fstream>
#include<string>

struct ShowAndCopy {
    const std::string& operator()(const std::string& s) const {
        std::cout << s;
        return s;
    }
};

int main()
{
    std::ifstream input("input.txt");
    std::vector<std::string> v;
    std::transform(std::istream_iterator<std::string>(input),
                   std::istream_iterator<std::string>(),
                   std::back_inserter(v),
                   ShowAndCopy());
    return 0;
}
0 голосов
/ 26 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...