2

我正在尝试从对象构造函数中的文件中读取对值。

该文件如下所示:

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_;
};
4

3 回答 3

1

您遇到了未定义的行为。似乎它只工作了一半,但这比根本不工作要糟糕一倍。

问题是这样的:

xs_.reserve(n);
ys_.reserve(n);

您只是保留一个大小,而不是创建它。将其替换为:

xs_.resize(n);
ys_.resize(n);

现在,xs[i]withi < n实际上是有效的。

如果有疑问,请使用xs_.at(i)代替xs_[i]. 它会执行额外的边界检查,从而避免您在不知道从哪里开始的情况下进行调试。

于 2013-10-15T07:21:59.537 回答
1
  1. 您正在使用reserve(),这会增加容量(存储空间),但不会增加向量的大小(即它不会向其中添加任何对象)。你应该resize()改用。这将处理size()为 0。

  2. 您正在打印xs_[i]andys_[i] 您增加i. 很自然,它们会是 0(或者可能是一个随机值)——你还没有初始化它们。

于 2013-10-15T07:22:04.977 回答
0

vector::reserve为进一步操作保留空间但不要更改向量的大小,您应该使用vector::resize.

于 2013-10-15T07:21:47.763 回答