未写入矢量的值
Values not written to vector
我正在尝试从对象的构造函数中的文件中读取对值。
该文件如下所示:
4
1 1
2 2
3 3
4 4
第一个数字是要读取的对数。
在某些行中,值似乎已正确写入向量。接下来他们就走了。我完全困惑了
inline
BaseInterpolator::BaseInterpolator(std::string data_file_name)
{
std::ifstream in_file(data_file_name);
if (!in_file) {
std::cerr << "Can't open input file " << data_file_name << std::endl;
exit(EXIT_FAILURE);
}
size_t n;
in_file >> n;
xs_.reserve(n);
ys_.reserve(n);
size_t i = 0;
while(in_file >> xs_[i] >> ys_[i])
{
// this line prints correct values i.e. 1 1, 2 2, 3 3, 4 4
std::cout << xs_[i] << " " << ys_[i] << std::endl;
// this lines prints xs_.size() = 0
std::cout << "xs_.size() = " << xs_.size() << std::endl;
if(i + 1 < n)
i += 1;
else
break;
// this line prints 0 0, 0 0, 0 0
std::cout << xs_[i] << " " << ys_[i] << std::endl;
}
// this line prints correct values i.e. 4 4
std::cout << xs_[i] << " " << ys_[i] << std::endl;
// this lines prints xs_.size() = 0
std::cout << "xs_.size() = " << xs_.size() << std::endl;
}
该类定义如下:
class BaseInterpolator
{
public:
~BaseInterpolator();
BaseInterpolator();
BaseInterpolator(std::vector<double> &xs, std::vector<double> &ys);
BaseInterpolator(std::string data_file_name);
virtual int interpolate(std::vector<double> &x, std::vector<double> &fx) = 0;
virtual int interpolate(std::string input_file_name,
std::string output_file_name) = 0;
protected:
std::vector<double> xs_;
std::vector<double> ys_;
};
您正在经历未定义的行为。看起来它工作了一半,但这比根本不工作要糟糕两倍。
问题是这样的:
xs_.reserve(n);
ys_.reserve(n);
您只是保留大小,而不是创建大小。将其替换为:
xs_.resize(n);
ys_.resize(n);
现在,xs[i]
i < n
实际上是有效的。
如有疑问,请使用 xs_.at(i)
而不是 xs_[i]
。它执行额外的边界检查,从而避免了在不知道从哪里开始的情况下进行调试的麻烦。
-
您使用的是
reserve()
,它会增加容量(存储空间),但不会增加矢量的大小(即它不会在其中添加任何对象)。您应该改用resize()
。这将处理size()
为 0。 -
您正在打印
xs_[i]
,并在递增i
后打印ys_[i]
。很自然,这些将是 0(或者可能是随机值) - 您尚未初始化它们。
vector::reserve
为进一步操作保留空间,但不更改向量的大小,应使用 vector::resize
.
相关文章:
- 没有找到相关文章