如何在C++中将数组中的所有元素初始化为相同的数字

neu*_*cer 18 c++ arrays g++

我正在尝试初始化一个设置为-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)

所以你不需要两次列出大小.

  • 我很惊讶没有人建议在初始化列表中写出-1次100次. (13认同)
  • 只是一个小注意事项,为此,`std :: fill_n`有点简单:`std :: fill_n(目录,100,-1);` (8认同)
  • 在C++ 11中,`std :: fill(std :: begin(directory),std :: end(directory), - 1);`有效. (4认同)
  • @Brian R. Bondy:我很惊讶没有人建议做`memset(目录,-1,...)`.在2的补码架构中,这实际上将`int`值设置为`-1` :) (3认同)
  • 正如每个旧的C程序员都知道的那样,静态分配的数组的大小是`sizeof(A)/ sizeof(A [0])` (2认同)
  • 关于_我对所有提出矢量的答案感到惊讶.它们甚至不是同一个东西!_ - >然而,我很惊讶没有评论者提到初始化和赋值也不是一回事. (2认同)

Aru*_*run 8

我建议使用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()方法.


Bri*_*ndy 6

如果您的元素数量较少,则可以依次指定它们.数组初始化通过指定每个元素来工作,而不是通过指定适用于每个元素的单个值.

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)