向量存储非相干数据

时间:2019-05-04 21:50:30

标签: c++ vector

我正在遵循《编程:原理与实践C +》中的一个示例,但是当我尝试显示矢量时,我得到的基本上是噪声(串联的随机数)。任何帮助将不胜感激。

我尝试使用数据类型(int,unsigned int),endl(而不是\ n)和轻微的语法更改。似乎没有任何作用

std::vector<double>sumbank;
int vectorsize = 0;

std::cout << "Enter amount of digits you will be storing \n";
std::cin >> vectorsize;
for (unsigned int a=0; a < vectorsize; ++a)
{
    double sum = 0;
    std::cout << "Please Enter Your First Number\n";
    std::cin >> sum;
    sumbank.push_back(sum);

}

for (unsigned int b = 0; b < sumbank.size(); ++b)
{
    std::cout << sumbank[b] << '/n';
}

1 个答案:

答案 0 :(得分:0)

std::cout << sumbank[b] << '/n';

您的换行符错误,必须为'\n'或更高的std::endl

您的消息

 std::cout << "Enter amount of digits you will be storing \n";

为什么是数字?您输入double

 std::cout << "Please Enter Your First Number\n";

为什么是“第一”?

您还比较了带符号和无符号的数字

我建议您检查输入是否成功,以便if (! (cin >> var)) ...error...,否则,如果输入无效值,则所有后续输入将不执行任何操作


编辑您的评论“ 我试图了解刷新缓冲区的作用,工作原理以及为什么有用”:

拥有

int vectorsize = 0;

std::cin >> vectorsize;

如果输入的不是数字,则流是错误的,并且在该状态下您无法成功读取它,因此要再次读取数字,您需要清除错误,并且当然绕过无效的输入仍然存在于流中。

由于您在代码中读取了多个数字,因此具有专用功能而不重复代码可能会很有用,

#include <iostream>

// return false in case of EOF, else true
bool readInt(std::istream & is, int & v)
{
  while (! (is >> v)) {
    // clear error
    is.clear();

    // bypass invalid input
    std::string s;

    if (!(is >> s)) {
      // end of file 
      return false;
    }

    std::cerr << "invalid number ('" << s << "'), redo" << std::endl;
  }

  return true;
}

int main()
{
  int v;

  std::cout << "enter an integer : ";
  if (!readInt(std::cin, v))
    std::cout << "EOF!" << std::endl;
  else
    std::cout << "the number is " << v << std::endl;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall c.cc
pi@raspberrypi:/tmp $ ./a.out
enter an integer : aze
invalid number ('aze'), redo
23
the number is 23
pi@raspberrypi:/tmp $ echo "aze qsd" | ./a.out
enter an integer : invalid number ('aze'), redo
invalid number ('qsd'), redo
EOF!
pi@raspberrypi:/tmp $ 

当然,您还可以定义一个模板函数,而不仅限于 int

#include <iostream>

// return false in case of EOF, else true
template <typename T>
bool readIt(std::istream & is, T & v)
{
  while (! (is >> v)) {
    // clear error
    is.clear();

    // bypass invalid input
    std::string s;

    if (!(is >> s)) {
      // end of file 
      return false;
    }

    std::cerr << "invalid input ('" << s << "'), redo" << std::endl;
  }

  return true;
}

int main()
{
  int v;

  std::cout << "enter an integer : ";
  if (!readIt(std::cin, v)) {
    std::cout << "EOF!" << std::endl;
    return -1;
  }
  else
    std::cout << "the integer is " << v << std::endl;

  float f;

  std::cout << "enter a float : ";
  if (!readIt(std::cin, f)) {
    std::cout << "EOF!" << std::endl;
    return -1;
  }
  else
    std::cout << "the float is " << f << std::endl;

  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall t.cc
pi@raspberrypi:/tmp $ ./a.out
enter an integer : 12
the integer is 12
enter a float : 12.34
the float is 12.34
pi@raspberrypi:/tmp $ 
pi@raspberrypi:/tmp $ 
pi@raspberrypi:/tmp $ ./a.out
enter an integer : a
invalid input ('a'), redo
12
the integer is 12
enter a float : b
invalid input ('b'), redo
12.34
the float is 12.34