读取用户创建的动态数组

时间:2018-02-08 22:41:09

标签: c++ arrays

如何创建一个能够读取用户创建的动态数组的函数,并且用户也会输入值?

int main() {

    int choice;
    int choice2;
    bool confirm = true;
    bool confirm2 = true;
    int *array1 = NULL;
    int *array2 = NULL;
    while(confirm==true){

        if (choice > 0)
        {
            array1 = new int[choice];
            confirm = false;
        }
        else if(choice <= 0)
        {
            cout<<"Try again, positive numbers only" << endl;
        }
    }
    //get size for 2nd array
    while (confirm2 == true){

        cout << "Input a number for array size for array 2: " << endl;
        cin >> choice2;

        if (choice2 > 0)
        {
            array2 = new int[choice2];
            confirm2 = false;
        }
        else if (choice2 <= 0)
        {
            cout << "Try again, positive numbers only" << endl;
        }
    }

    cout << "Enter numeric values into the array" << endl;

    for (int i = 0; i < choice; i++)
    {
        int item;
        cout << "Enter a numeric for item " << i << endl;
        cin >> item;
        *(array1 + i) = item;
    }
}

我的问题在于我不知道是否可以创建一个能够读取和修改用户创建的数组的函数。

2 个答案:

答案 0 :(得分:0)

Jeremy,如果你仍然卡住,std::vector实现提供了一个灵活的容器,可以像传统的C数组一样使用,但也提供构造函数和成员函数来填充,扩展和迭代未知的来自用户的输入数量。要创建一个空容器,您只需要:

std::vector<int> v;   /* to create an empty vector container v */

注意:不同的构造函数允许您在声明时初始化所有成员,填充,从另一个数组复制等。)

使用typedef可以通过从方便的标签创建别名来消除重复输入std::vector<type>的需要,例如:

typedef std::vector<int> ivec_t;

(您现在可以使用ivect_t代替std::vector<int>

由于您正在处理未知数量的输入,因此将push_back函数添加到向量作为下一个元素。例如,要从stdin读取未知数量的整数值并将它们添加到矢量中,您可以这样做:

ivec_t v;     /* declares an empty vector of integers container */
int n;

while (std::cin >> n)   /* for each value read on stdin  */
    v.push_back(n);     /* push the value into the array */

现在您已将所有整数值存储在容器中。要访问每个,您可以使用v[x] 0 <= X < nelements的标准数组表示法。但是,要迭代列表,迭代器可以与成员函数begin()end()提供的起始和结束元素地址一起使用。因此,要访问容器中的每个值,您只需执行以下操作:

/* use an iterator from begin to end to outpu stored values */
for (auto it = std::begin(v); it != std::end(v); it++)
    std::cout << " " << *it;    /* dereference iterator for value */
std::cout << "\n";

完全放弃,您可以使用以下内容将stdin中未知数量的整数值读入您的矢量容器中:

#include <iostream>
#include <vector>

typedef std::vector<int> ivec_t;

int main (void) {

    ivec_t v;     /* declares an empty vector of integers container */
    int n;

    while (std::cin >> n)   /* for each value read on stdin  */
        v.push_back(n);     /* push the value into the array */

    /* use an iterator from begin to end to outpu stored values */
    for (auto it = std::begin(v); it != std::end(v); it++)
        std::cout << " " << *it;    /* dereference iterator for value */
    std::cout << "\n";

    return 0;
}

示例使用/输出

$ echo "2 4 6 8 10" | ./bin/vector_push_back
 2 4 6 8 10

使用基于范围的循环

正如Sean在评论中指出的那样,您可以使用基于范围的循环来简化迭代,以迭代v中的值。这可以通过值,参考或前向参考来完成,例如

    /* iterating over the values in v using access by value */
    for (auto i : v)
        std::cout << " " << i;    /* dereference iterator for value */
    std::cout << "\n";

仔细看看,如果您有其他问题,请告诉我。

答案 1 :(得分:0)

我能够使用基本的读取指针来解决它并调整记忆并重新分配,坦率地说是非常麻烦,但感谢您的建议。我现在要查看矢量并试着继续前进。尽管我想使用矢量,但我的教授要求我们完成这些项目任务,而不使用我们应该知道的任何东西。