C++ 如何初始化并返回c+中的数组+;头文件?
我不太擅长使用头文件,但我想使用头文件从文件中读取数据,并将数据作为向量返回到主cpp文件中 这是我的readposcar.h文件:C++ 如何初始化并返回c+中的数组+;头文件?,c++,return-value,header-files,C++,Return Value,Header Files,我不太擅长使用头文件,但我想使用头文件从文件中读取数据,并将数据作为向量返回到主cpp文件中 这是我的readposcar.h文件: #include <fstream> #include <sstream> #include <vector> using namespace std; int add(void) { double a1x, a1y, a1z, a2x, a2y, a2z, a3x, a3y, a3z; // I want all
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;
int add(void) {
double a1x, a1y, a1z, a2x, a2y, a2z, a3x, a3y, a3z; // I want all this stuff in vector form
int i;
double scale;
string line; stringstream dum;
ifstream poscar ("POSCAR");
for (i=1; i<=5; i++) {
getline(poscar,line);
if (i==2) {stringstream dum(line); dum >> scale;}
if (i==3) {stringstream dum(line); dum >> a1x >> a1y >> a1z;}
if (i==4) {stringstream dum(line); dum >> a2x >> a2y >> a2z;}
if (i==5) {stringstream dum(line); dum >> a3x >> a3y >> a3z;}
}
vector<double> myvec(3);
myvec[0] = a1x;
myvec[1] = a1y;
myvec[2] = a1z;
return myvec;
}
#包括
#包括
#包括
使用名称空间std;
整数加(空){
双重a1x,a1y,a1z,a2x,a2y,a2z,a3x,a3y,a3z;//我想要所有这些向量形式的东西
int i;
双尺度;
弦线;
ifstream poscar(“poscar”);
对于(i=1;i>scale;}
如果(i==3){stringstream dum(line);dum>>a1x>>a1y>>a1z;}
如果(i==4){stringstream dum(line);dum>>a2x>>a2y>>a2z;}
如果(i==5){stringstream dum(line);dum>>a3x>>a3y>>a3z;}
}
载体myvec(3);
myvec[0]=a1x;
myvec[1]=a1y;
myvec[2]=a1z;
返回myvec;
}
这是我的.cpp文件:
#include <iostream>
#include <fstream>
#include "readposcar.h"
using namespace std;
int main(void) {
int nbasis = 2;
int nkpts = 10;
vector<double> myvec2(3);
myvec2 = add();
cout << "No. of k-points: " << nkpts << endl;
return 0;
}
#包括
#包括
#包括“readposcar.h”
使用名称空间std;
内部主(空){
int-nbasis=2;
int-nkpts=10;
载体myvec2(3);
myvec2=add();
无法返回正确的类型。请尝试:
vector<double> add() {
...
return myvec;
}
<>避免拷贝“代码>向量”,这可能是昂贵的,除非C++编译器能够使用优化复制操作,在这种情况下,可以使用前一种方法语义。
(感谢@aryjczyk和@AlexB指出最后一点)。您没有返回正确的类型。请尝试:
vector<double> add() {
...
return myvec;
}
<>避免拷贝“代码>向量”,这可能是昂贵的,除非C++编译器能够使用优化复制操作,在这种情况下,可以使用前一种方法语义。
(感谢@aryjczyk和@AlexB指出最后一点)。您应该将add
的返回类型从int
更改为vector您应该将add
的返回类型从int
更改为vector
在调用getline()后分析该行
将每个解析的值转换为double
调用vector上的push_以添加双精度
也可以考虑将引用传递给向量。
因此,函数的签名将更改为:
int add( std::vector<double> & values )
intadd(标准::向量和值)
这样可以避免从函数返回时进行不必要的复制
在调用getline()后分析该行
将每个解析的值转换为double
调用vector上的push_以添加双精度
也可以考虑将引用传递给向量。
因此,函数的签名将更改为:
int add( std::vector<double> & values )
intadd(标准::向量和值)
这样可以避免从函数返回时进行不必要的复制。这对我很有效。感谢大家的快速回复!.std::vector add(void){…return myvec;}您可能会后悔将“使用命名空间std;”这对我来说很有用。谢谢大家的快速回复!.std::vector add(void){…return myvec;}你可能会后悔放了“using namespace std;”在headercompiler中,它将删除副本,称为RVO。传递输出参数很难看,如果不能,请避免使用。如果您使用的编译器不超过10年,您应该绝对按值返回。它将是RVO或移动构造函数。谢谢各位;我编辑了我的答案,以提及RVO的使用。编译器将elide副本称为RVO。传递输出参数很难看,如果不能,请避免使用。如果您使用的编译器不超过10年,则绝对应该按值返回。它将是RVO或移动构造函数。谢谢各位;我编辑了我的答案,以提及RVO.Nope的使用。继续并按值返回。@aschelper、 不管你喜欢与否,使用引用比按值返回向量更有效。你不能100%肯定编译器会执行RVO。有了引用,毫无疑问会发生什么。有了C++11,你可以100%肯定它不会调用复制构造函数。不。继续,按值返回。@aschelper,不管你喜欢与否,这是正确的使用引用比按值返回向量更有效。您不能100%确定编译器将执行RVO。使用引用毫无疑问会发生什么。使用C++11,您可以100%确定它不会调用复制构造函数。