在C ++中访问向量

时间:2011-01-26 06:19:11

标签: c++ vector

我写了一个简单的程序,它访问一个名为“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 个答案:

答案 0 :(得分:4)

对于初学者来说,这里是你刚才编写的代码的更清晰版本:

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或{{ 1}}秒。这样可以省去以后必须转换值的麻烦。例如:

double

现在,您可以像这样添加所有值:

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>

希望这有帮助!

答案 1 :(得分:2)

您的计划不正确。你可能的意思是:

#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;
}

答案 2 :(得分:0)

是的,您可以遍历字符串向量的内容,将值转换为整数或浮点值并对它们求和。