奇怪的矢量<long>加法,'0'为'-1'

Weird vector<long> addition with '0' as '-1'

本文关键字:加法 gt long lt      更新时间:2023-10-16

我正在编写一个基本的国际象棋程序来计算你可以用给定的国际象棋数字制作多少组。数据文件:

4
22 3 5 6 2 0
1 1 1 1 1 1
8 4 4 4 1 2
5 3 3 3 0 2

代码:

#include <iostream>
#include <fstream>
#include <vector>
int main
(int argc, char *argv[])
{
    std::fstream data_file;
    size_t i, k;
    std::vector<long> chess;
    long t, n;
    data_file.open("U1.txt", std::ios::in);
    data_file >> n;
    for (i = 0; i < n; i++)
        chess.push_back(0);
    for (i = 0; i < n; i++) {
        for (k = 0; k < 6; k++) {
            data_file >> t;
            std::cout << t << " ";
            chess[k] += t;
        }
        std::cout << std::endl;
    }
    data_file.close();
    for (int i = 0; i < 6; i++)
        std::cout << chess[i] << " ";
    std::cout << std::endl;
    data_file.open("U1rez.txt", std::ios::out);
    data_file << n;
    std::cout << n << std::endl;
    data_file.close();
    return EXIT_SUCCESS;
}

输出:

22 3 5 6 2 0 
1 1 1 1 1 1 
8 4 4 4 1 2 
5 3 3 3 0 2 
36 11 13 14 3 4 
4

为什么我在 36、11、13 和 14 之后的第 5 行的最终结果中得到 34?当我打印测试值时,我似乎得到了正确的数字,但是将它们添加到矢量容器中时出现了严重的错误。

for (i = 0; i < n; i++)
    chess.push_back(0);

...

    for (i = 0; i < n; i++) {
    for (k = 0; k < 6; k++) {
        data_file >> t;
        std::cout << t << " ";
        chess[k] += t;
    }
    std::cout << std::endl;
}

在这里,您初始化了向量中的 n(=4( 个位置,但在这里您正在访问向量国际象棋的索引 4 和 5,这导致了加法问题。

在一个不相关的说明中,如果你放弃 C 强加的一些规则,你会更容易地使用 C++。

  • C++ API 使用范围限定的资源管理;即,无需在此处显式关闭文件句柄,因为当在声明的范围结束时调用其析构函数时,该类会为您执行此操作。
  • 首选std::cout << "n"而不是std::cout << std::endl,除非您实际上打算插入换行符并刷新缓冲区。很多C++程序员还在用printf,我个人认为它比C++丑陋的IO标准解决方案要优雅很多——随意使用printf
  • 当您在使用变量的位置声明变量时,您是否发现您的代码更易于管理和阅读(例如 for (size_type i = 0; ... ; ...)(,而不是在你的方法开始时?这也允许编译器在寄存器用法方面做出更好的选择,因为它具有有关临时变量范围的更多信息。

以下是 C++11 的一些功能,它们也可以为您节省一些时间:

  • 自动类型推断:当编译器可以推断变量的类型时,您不必显式指定它;您可以使用auto代替(例如 auto x = parse_data(); (。
  • 范围:如果您在提供全局定义begin()end()的容器(例如任何标准容器(上运行,则代替此:

typedef typename container_type::const_iterator iter;
for (iter i = begin(container), iter l = end(container); i != l; ++i) { ... }

您可以这样做:

 for (const auto& x : container) { ... }

我只是想给你一些快速的指示,可以节省一些时间。