也许我对shared_poin有点不对,或者我的一些基本缺点但我无法做到这一点。所以我想从文件中读取一些数据。数据文件的每一行都有位置和动量数据,第一行存储数据点的数量。
我需要将此内容读入我的数据结构中,由于某些原因,我的图表无法填充,尽管数据正确读入。
const int dim = 3; // dimension of problem
template <typename T, typename G>
// T is the type of the inputted locations and G is the type of the
// distance between them
// for example: int point with float/double distance
struct Node{
std::pair< std::array<T, dim>,std::pair< std::array<T, dim>, G > > pos; // position
std::pair< std::array<T, dim>,std::pair< std::array<T, dim>, G > > mom; // momentum
// a pair indexed by a position in space and has a pair of position
// and the distance between these points
};
template <typename T, typename G>
struct Graph{
int numOfNodes;
std::vector< Node<T,G> > nodes;
};
这是数据结构,这里是我的读函数(std::cout
- s仅用于测试):
template <typename T, typename G>
std::istream& operator>>(std::istream& is, std::shared_ptr< Graph<T,G> >& graph){
is >> graph->numOfNodes; // there's the number of nodes on the first line of the data file
std::cout << graph->numOfNodes << "\n";
for(int k=0; k<graph->numOfNodes; k++){
Node<T,G> temp;
for(auto i : temp.pos.first){
is >> i;
std::cout << i << "\t";
}
std::cout << "\t";
for(auto i : temp.mom.first){
is >> i;
std::cout << i << "\t";
}
std::cout << "\n";
graph->nodes.push_back(temp);
}
return is;
}
我也有输出功能。因此,如果我输出在读入期间我打算填充的图形被清零。 os节点的数量是正确的,但是位置和momente都被清零。我做错了什么?提前致谢。
答案 0 :(得分:1)
for(auto i : temp.pos.first){
is >> i;
std::cout << i << "\t";
}
将此视为与功能类似。如果你有类似的东西:
void doX(int i) { i = 42; }
int main() {
int j=5;
doX(j);
return j;
}
运行此代码,您将看到程序返回值5.这是因为函数doX
按值i
获取;它基本上需要变量的副本。
如果用
替换doX
的签名
void doX(int &i)
并运行代码,你会看到它返回42.这是因为函数现在通过引用获取参数,因此可以修改它。
你的循环行为类似。正如您现在所拥有的那样,它们依次获取数组中值的副本,但不是参考。
与该功能一样,您可以将循环更改为
for(auto &i : temp.pos.first){
is >> i;
std::cout << i << "\t";
}
然后,您可以更改存储在数组中的值。