使用c ++中的'cin'使数组与输入一样大

时间:2014-01-18 14:11:48

标签: c++ arrays standard-library

我不熟悉c ++编程,并且没有掌握最基本的技术。

我的问题是我想将字符读入数组并使该数组与输入一样长。例如,如果输入为'a','b'和'c',则数组的长度为3.在java中,对于使用StdIn包的整数,这将是这样的:

int[] n = StdIn.readInts(); //enter the numbers 5,6,7,8 f.x.
StdOut.println(n.length); //would print 4

希望我很清楚。

4 个答案:

答案 0 :(得分:2)

您可以轻松使用std::vector来存储您的输入。例如,使用push_backemplace_back,您可以根据需要推送尽可能多的元素。您将能够通过size成员函数检索数组的大小。

以下是一个例子:

std::vector<char> vector;
for (int i = 0; i < 3; i++) {
    char buffer;
    std::cin >> buffer;
    vector.push_back(buffer);
}

上面的代码会要求3个字符并将它们存储到vector中。 vector接口有一个方便的“类似数组”接口,您可以使用它。例如,要检索第三个元素,您可以使用vector[2]

答案 1 :(得分:2)

在C ++中,它很容易做到:

std::vector<int> int_vector;
std::copy(std::istream_iterator<int>(std::cin),
          std::istream_iterator<int>(),
          std::back_inserter(int_vector));

参考文献:

答案 2 :(得分:0)

如果您想阅读用户输入的所有数字,那么您可以这样做:

int number;
std::vector<int> numbers;

while (std::cin >> number)
   numbers.push_back(number);

答案 3 :(得分:0)

如果您看一下StdIn.readInts的实现,您会看到它可以分两步描述:

  • 从标准输入中读取所有“标记”,其中“标记”是由正则表达式分割的字符串(对于每一行),然后
  • 对于每个标记,将其解释为整数(parseInt)并“追加”到数组(因为它知道上一步中的标记数,它创建的数组具有足够的空间以容纳正确的数量)< / LI>

这可以模仿C ++编写类似的类,使用类似的方法,或者在您需要它们的时候执行上述步骤,考虑到std::vector可能比C ++数组更接近Java数组,并且std::vector可以在dinamycally生长。

在您的示例中,要读取由“空格”分隔的整数列表,

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> n;
    int tmp;

    while(std::cin >> tmp) {
        n.push_back(tmp);
    }

    std::cout << n.size() << "\n";

    return 0;
}

足够(但是看看其他答案,空气中有一个很好的std::copy解决方案),但如果你想模仿Java行为(如果我打算正确地阅读代码),那就像

#include <iostream>
#include <vector>
#include <sstream>

int main()
{
    std::vector<int> n;

    // read in the "pieces" as string
    std::vector<std::string> ns;    
    std::string tmps;
    while(std::cin >> tmps) {
        ns.push_back(tmps);
    }

    // pre C++11 way... try to interpret the "pieces" as int
    for (std::vector<std::string>::const_iterator it = ns.begin();
         it != ns.end();
         ++it) 
    {
        int tmp;
        if (std::istringstream(*it) >> tmp) {
            n.push_back(tmp);
        }
    }

    std::cout << n.size() << "\n";

    // post C++11 way, just to test...
    for (auto v : n) std::cout << v << "\n";

    return 0;
}

应该更接近Java StdIn.readInt()的作用(再次,根据我对它的理解,动态阅读代码)。