发现包含零的动态int数组的大小

时间:2016-08-03 20:56:10

标签: c++ arrays dynamic

我们不允许使用矢量。

另一个有问题的noobie。我试图找到一个初始化为50的动态int数组的索引。我们只能使用动态int数组。

比如说我只在这个数组中输入10个整数:1 9 5 3 8 0 8 2 0 6

数组的其余部分为NULL。目标是保留输入到此数组中的整数值并将它们放入输出文件中。所以我想要的整数数组的大小是9.但是当我执行以下操作时:

int index = 0;

    while (intArray[index])
    {
        index++;
    }

它告诉我索引是5,因此只有5个值被复制到输出文件中。我知道这是因为数组中的0。如果数组中没有0,则结果按预期结果出现。如何绕过这个以使索引正确反映为9并且所有值都被正确复制?我很感激任何意见!

4 个答案:

答案 0 :(得分:2)

正如评论中所指出的,鉴于您无法使用std::vector(*叹*),这里的最佳方法是制作您自己的最小dynamic_array(模仿std::vector)它总是知道自己的大小。

它的界面看起来像这样:

template<typename _Ty>
class dynamic_array {
public:
    typedef _Ty value_type;
    typedef const _Ty& const_reference;
    typedef _Ty& reference;
    typedef std::size_t size_type;
    //... other necessary typedefs
    dynamic_array() : arr(), arr_size(0), allocated_size(0) {}
    dynamic_array(size_type n) : arr_size(n), allocated_size(n) { allocate(n); }
    ~dynamic_array() { delete arr; }
    size_type size() const noexcept { return arr_size; }
    const_reference operator[](size_type n) const { return arr[n]; }
    reference operator[](size_type n) { return arr[n]; }
    void push_back(const value_type& _val) { 
        ++arr_size;
        // actual implementation of pushing back _val up to you
    }
private:
    value_type* arr;
    size_type arr_size; // number of elements
    size_type allocated_size; // actual number of allocated elements in memory
    void allocate(size_type n) { arr = new value_type[n]; }
};

然后通过索引迭代你只需要执行:

dynamic_array<int> darr;
// populate darr
for (int i = 0; i < darr.size(); ++i) {
    // do stuff with each element accessing via: darr[i] as before
}

编辑 - 如果您可以使用std::unique_ptr,请使用此代替原始指针value_type* arr,以避免任何潜在的内存管理问题。

答案 1 :(得分:0)

只有当您确定输入数据为负数时,您才可以执行此类操作:

#include <iostream>

int main()
{
    int MyArray[50]; // declare your array

    // ..

    for (int i = 0; i < 50; i++)
        MyArray[i] = -1; // fill with negatives

    MyArray[0] = 0; // some data
    MyArray[1] = 10; // some data

    for (int i = 0; i < 50; i++)
    {
        if (MyArray[i] >= 0 )
        {
            std::cout << MyArray[i];
            // write to your file
        }
    }

    //..

    return 0;
}

答案 2 :(得分:0)

整数值没有NULL这样的东西。因此,使用了3种常用方法:

  1. 特殊价值,结束的标记。这种方法用于C风格的字符串,其中&#39; \ 0&#39;用作结束。对于整数,这种方法不起作用,因为0是&#34;正常&#34;值。您可以使用其他一些特殊值,例如std::numeric_limits<int>::minstd::numeric_limits<int>::max,但这不是一个很好的方法。
  2. 有另一个变量,它保存当前的数组大小。请注意,这通常与分配了多少元素不同。这可以包装成一个类。这就是std::vector的实施方式。
  3. 让另一个变量指针指向最后一个之后的pone元素。这对于在标准算法中使用非常有用。
  4. 方法2和3非常接近,一个可以很容易地转换为另一个。所以我建议使用start和behind_end迭代器重写你的算法:

    auto end = myArray + 5; // 5 elements in array
    for( auto it = myArray; it != end; ++it ) {
        std::cout << *it << endl;
    }
    

    此代码可以很容易地模板化并与标准容器一起使用。

答案 3 :(得分:0)

boost :: static_vector在这里会有所帮助。它实际上是矢量和数组之间的交叉:具有固定容量的堆栈分配向量或具有跟踪逻辑大小的一些工具的未初始化数组。

使用示例:

#include "boost/container/static_vector.hpp"
#include <iostream>

namespace cnt = boost::container;

void foo()
{
    cnt::static_vector<int, 50> buf = {1, 9, 5, 3, 8, 0, 8, 2, 0, 6,};
    std::cout << buf.size();
}

int main()
{
    foo();   
}