访问C++中的向量

问题描述:

我写了一个简单的程序,用于访问名为“input.txt”的文件,并将其内容推送到字符串类型的向量中。访问C++中的向量

#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(); 

} 

我知道这是不是要做到这一点的最好办法,但有什么办法,我可以再访问这个载体,用它的公式?说如果我想将矢量的所有元素加在一起并找出总和?

+0

你的代码不正确。特别是循环。 – wilhelmtell 2011-01-26 06:24:55

+1

看到这个为什么你的循环是错误的:http://*.com/questions/4258887/semantics-of-flags-on-basic-ios – GManNickG 2011-01-26 06:38:29

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

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); 

希望这有助于!

是的,你可以迭代字符串矢量的内容,将值转换为整数或浮点值并将它们相加。

你的程序不正确。你大概意思是这样的:

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