c++;将txt值存储到vector中的快速方法<;int>; 我想用C++来存储我的文本值,使用C++ +/p>

c++;将txt值存储到vector中的快速方法<;int>; 我想用C++来存储我的文本值,使用C++ +/p>,c++,C++,我的文本值是: 250 251 251 252 如果我的文本值是字符(例如) afv atd 阿格 那我就用 vector<std::string> arr; std::string path = "C:\\myText.txt"; glob(path,arr,false); 向量arr; std::string path=“C:\\myText.txt”; 全局(路径、arr、false); 但对于文本文件中的整数值,上述代码不可能实现 因此,我实现了以下代码: vecto

我的文本值是: 250 251 251 252

如果我的文本值是字符(例如) afv atd 阿格

那我就用

vector<std::string> arr;
std::string path = "C:\\myText.txt";
glob(path,arr,false);
向量arr;
std::string path=“C:\\myText.txt”;
全局(路径、arr、false);
但对于文本文件中的整数值,上述代码不可能实现

因此,我实现了以下代码:

vector<int> arr;
ifstream stream("C:\\myText.txt");
int num;
while(getline(stream,line)){
    istringstream(line) >> num;
    arr.push_back(num);
}
向量arr;
ifstream流(“C:\\myText.txt”);
int-num;
while(getline(流,行)){
istringstream(行)>>num;
arr.push_back(num);
}
我的问题是:有没有更快的方法来实现上述代码


类似于使用glob方法实现整数?

这可能不会更快,但代码行更少,并且不依赖于从
std::strign
为每一行构建
istringstream
。由于可以从迭代器范围构造向量,因此我们可以使用从
ifstream
对象构造的向量和默认构造的向量来标记文件的结尾

std::ifstream fin("test.txt");
std::vector<int> data{ std::istream_iterator<int>(fin), std::istream_iterator<int>() };
std::ifstream-fin(“test.txt”);
向量数据{std::istream_迭代器(fin),std::istream_迭代器();

这将从文件中读取整数,并将它们直接插入到向量中。我不确定这是否会减少内存分配,然后使用
push_back

这可能不会更快,但它的代码行更少,并且不依赖于从
std::strign
为每一行构建
istringstream
。由于可以从迭代器范围构造向量,因此我们可以使用从
ifstream
对象构造的向量和默认构造的向量来标记文件的结尾

std::ifstream fin("test.txt");
std::vector<int> data{ std::istream_iterator<int>(fin), std::istream_iterator<int>() };
std::ifstream-fin(“test.txt”);
向量数据{std::istream_迭代器(fin),std::istream_迭代器();
这将从文件中读取整数,并将它们直接插入到向量中。我不确定这是否会比使用
push_-back
更少的内存分配

我的文本值是:250251 251 252

如果我的文本值为字符(例如)afv atd agg

在这两种情况下,您都可以省略
getline()
istringstream

template<typename T> 
void glob(std::istream& is,std::vector<T>& arr) {
    T val;
    while(is >> val) {
        arr.push_back(num);
    }
}
模板
void glob(std::istream&is,std::vector&arr){
T值;
while(is>>val){
arr.push_back(num);
}
}
像这样使用它:

ifstream stream("C:\\myText.txt"); // myText.txt contains all numbers like 250 251 251 ...
std::vector<int> v;
glob(stream,v);
ifstream(“C:\\myText.txt”);//myText.txt包含所有数字,如250 251 251。。。
std::向量v;
glob(stream,v);

ifstream(“C:\\myText.txt”);//myText.txt包含所有单词,如afv atd agg。。。
std::向量v;
glob(stream,v);
我的文本值是:250251 251 252

如果我的文本值为字符(例如)afv atd agg

在这两种情况下,您都可以省略
getline()
istringstream

template<typename T> 
void glob(std::istream& is,std::vector<T>& arr) {
    T val;
    while(is >> val) {
        arr.push_back(num);
    }
}
模板
void glob(std::istream&is,std::vector&arr){
T值;
while(is>>val){
arr.push_back(num);
}
}
像这样使用它:

ifstream stream("C:\\myText.txt"); // myText.txt contains all numbers like 250 251 251 ...
std::vector<int> v;
glob(stream,v);
ifstream(“C:\\myText.txt”);//myText.txt包含所有数字,如250 251 251。。。
std::向量v;
glob(stream,v);

ifstream(“C:\\myText.txt”);//myText.txt包含所有单词,如afv atd agg。。。
std::向量v;
glob(stream,v);

我不知道
getline()
与integers@FirstStep:
istringstream>
进行转换。@user so
getline()
将整个
作为字符串放入
中,那么
istringstream
到底做了什么?第一次迭代时
num
的值是多少?谢谢编辑:如果每行只有一个整数,然后它会有意义,OP的文本值是误导性的me@FirstStep检查@Firststep:它创建一个新的
std::istringstream
并用
行的内容初始化,之后您可以使用与任何其他流相同的方式使用istringstream,并使用它的
>
操作符。就像
std::cin>>a_int我不知道
getline()
与integers@FirstStep:
istringstream>
进行转换。@user so
getline()
将整个
作为字符串放入
中,那么
istringstream
到底做了什么?第一次迭代时
num
的值是多少?谢谢编辑:如果每行只有一个整数,然后它会有意义,OP的文本值是误导性的me@FirstStep检查@Firststep:它创建一个新的
std::istringstream
并用
行的内容初始化,之后您可以使用与任何其他流相同的方式使用istringstream,并使用它的
>
操作符。就像
std::cin>>a_int我无法在glob方法中使用stream对象,它给了我一个错误:“无法将'stream2'从'std::ifstream{aka std::basic_ifstream}'转换为'cv::String{aka std::basic_String}'glob(stream,v);”如果我没有弄错,这意味着它无法将ifstream转换为string@AhmetTavli你可能弄错了我的答案。您应该将
std::istream&
传递给模板函数,而不是文件名。在函数调用之外创建
std::ifstream
实例。我无法在glob方法中使用stream对象,它给了我一个错误:“无法将'stream2'从'std::ifstream{aka std::basic_ifstream}'转换为'cv::String{aka std::basic_String}'glob(stream,v);”如果我没有弄错,它的意思是,它无法将ifstream转换为string@AhmetTavli你可能弄错了我的答案。您应该将
std::istream&
传递给模板函数,而不是文件名。在函数调用之外创建
std::ifstream
实例。绝对是一种更好的方法,我不必在循环中使用变量num.和初始化istringstream。@AhmetT