我们不允许使用矢量。
另一个有问题的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并且所有值都被正确复制?我很感激任何意见!
答案 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种常用方法:
std::numeric_limits<int>::min
或std::numeric_limits<int>::max
,但这不是一个很好的方法。std::vector
的实施方式。方法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();
}