我正在尝试初始化一个设置为-1的int数组.
我尝试了以下,但它不起作用.它只将第一个值设置为-1.
int directory[100] = {-1};
Run Code Online (Sandbox Code Playgroud)
为什么它不能正常工作?
GMa*_*ckG 37
我对所有答案都表示惊讶vector
.他们甚至不是一回事!
使用std::fill
,来自<algorithm>
:
int directory[100];
std::fill(directory, directory + 100, -1);
Run Code Online (Sandbox Code Playgroud)
不直接关注这个问题,但在数组方面你可能想要一个很好的辅助函数:
template <typename T, size_t N>
T* end(T (&pX)[N])
{
return pX + N;
}
Run Code Online (Sandbox Code Playgroud)
赠送:
int directory[100];
std::fill(directory, end(directory), -1);
Run Code Online (Sandbox Code Playgroud)
所以你不需要两次列出大小.
我建议使用std::array
.有三个原因:
1.数组在下标(即operator[]
)操作中为索引越界提供运行时安全性,
2.数组自动携带大小而不需要单独传递
3.最重要的是,数组提供的fill()
方法是这个问题需要
#include <array>
#include <assert.h>
typedef std::array< int, 100 > DirectoryArray;
void test_fill( DirectoryArray const & x, int expected_value ) {
for( size_t i = 0; i < x.size(); ++i ) {
assert( x[ i ] == expected_value );
}
}
int main() {
DirectoryArray directory;
directory.fill( -1 );
test_fill( directory, -1 );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用数组需要使用"-std = c ++ 0x"进行编译(适用于上面的代码).
如果那不可用或者如果那不是一个选项,则可以选择其他选项,如std :: fill()(由GMan建议)或手工编码fill()方法.
如果您的元素数量较少,则可以依次指定它们.数组初始化通过指定每个元素来工作,而不是通过指定适用于每个元素的单个值.
int x[3] = {-1, -1, -1 };
Run Code Online (Sandbox Code Playgroud)
您还可以使用向量并使用构造函数初始化所有值.您可以稍后通过指定访问原始数组缓冲区&v.front()
std::vector directory(100, -1);
Run Code Online (Sandbox Code Playgroud)
有一种C方式也可以使用memset
或使用各种其他类似的功能. memset
适用于指定缓冲区中的每个字符,但它可以很好地处理值,0
但可能不起作用,具体取决于负数的存储方式-1
.
您还可以使用STL通过使用fill_n初始化数组.对于每个元素的通用操作,您可以使用for_each.
fill_n(directory, 100, -1);
Run Code Online (Sandbox Code Playgroud)
或者,如果你真的想要你可以蹩脚的方式,你可以做100循环和做的for循环 directory[i] = -1;
小智 5
如果你真的需要数组,可以使用boosts 数组类.它的分配成员完成工作:
boost::array<int,N> array; // boost arrays are of fixed size!
array.assign(-1);
Run Code Online (Sandbox Code Playgroud)