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

时间:2010-05-23 03:32:29

标签: c++ arrays g++

我正在尝试初始化一个int数组,其中所有内容都设置为-1。

我尝试了以下操作,但它不起作用。它只将第一个值设置为-1。

int directory[100] = {-1};

为什么它不能正常工作?

16 个答案:

答案 0 :(得分:34)

我对所有提出vector的答案感到惊讶。它们甚至不是一回事!

使用<algorithm>中的std::fill

int directory[100];
std::fill(directory, directory + 100, -1);

不直接关注这个问题,但在数组方面你可能想要一个很好的辅助函数:

template <typename T, size_t N>
T* end(T (&pX)[N])
{
    return pX + N;
}

,并提供:

int directory[100];
std::fill(directory, end(directory), -1);

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

答案 1 :(得分:6)

我建议使用std::array。原因有三:
 1. array在下标(即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;
}

使用array 需要使用“-std = c ++ 0x”进行编译(适用于上面的代码)。

如果那不可用或者不是一个选项,那么可以选择其他选项,如std :: fill()(由GMan建议)或手工编码fill()方法。

答案 2 :(得分:5)

如果你的元素数量较少,你可以一个接一个地指定它们。数组初始化通过指定每个元素来工作,而不是通过指定适用于每个元素的单个值。

int x[3] = {-1, -1, -1 };

您还可以使用向量并使用构造函数初始化所有值。您可以稍后通过指定&v.front()

来访问原始数组缓冲区
std::vector directory(100, -1);

使用memset或其他各种类似的功能也有一种C方式。 memset适用于指定缓冲区中的每个字符,但它适用于0等值,但可能无效,具体取决于-1的负数存储方式。


您还可以使用STL通过fill_n初始化阵列。对于每个元素的通用操作,您可以使用for_each。

fill_n(directory, 100, -1);

或者,如果你真的想要你可以采取蹩脚的方式,你可以进行100次迭代的for循环并执行directory[i] = -1;

答案 3 :(得分:5)

如果您确实需要数组,可以使用boost array类。分配成员完成工作:

boost::array<int,N> array; // boost arrays are of fixed size!
array.assign(-1);

答案 4 :(得分:3)

它确实有效。您对初始化程序的期望不正确。如果您真的希望采用这种方法,那么初始化器中需要100个以逗号分隔的-1。但是当你增加数组的大小时会发生什么呢?

答案 5 :(得分:1)

工作正常。这就是列表初始化程序的工作方式。

我相信C99标准的6.7.8.10涵盖了这个:

  

如果对象具有自动功能   存储持续时间未初始化   显然,它的价值是   不定。如果有一个对象   静态存储持续时间不是   显式初始化,然后:

     
      
  • 如果它有指针类型,则将其初始化为空指针;
  •   
  • 如果它有算术类型,则初始化为(正数或无符号)   零;
  •   
  • 如果是聚合,则根据每个成员进行初始化(递归)   遵守这些规则;
  •   
  • 如果是联合,则初始化第一个命名成员(递归)   根据这些规则。
  •   

如果您需要使数组中的所有元素具有相同的非零值,则必须使用循环或memset

另请注意,除非您确实知道自己在做什么,vectors are preferred over arrays in C++

  

以下是您需要了解的有关容器与数组的内容:

     
      
  1. 容器类使程序员的工作效率更高。因此,如果您坚持使用数组而周围的人愿意使用容器类,那么您的工作效率可能会低于他们(即使您比他们更聪明,更有经验!)。
  2.   
  3. 容器类让程序员编写更强大的代码。因此,如果你坚持使用数组,而周围的人愿意使用容器类,你的代码可能会比他们的代码有更多的错误(即使你更聪明,更有经验)。
  4.   
  5. 如果你是如此聪明且经验丰富,你可以使用数组尽可能快和安全,因为他们可以使用容器类,其他人可能会最终维护你的代码,他们可能会引入错误。或者更糟糕的是,你将是唯一能够维护你的代码的人,所以管理层会让你从开发中解脱出来,让你进入一个全职维护角色 - 就像你一直想要的那样!
  6.   

链接问题还有很多内容;给它一个阅读。

答案 6 :(得分:1)

使用int的向量而不是数组。

vector<int> directory(100,-1);                       // 100 ints with value 1

答案 7 :(得分:1)

你只需使用for循环,如下所示: -

for (int i=0; i<100; i++)
{ 
a[i]= -1;
}

因为你想要你可以得到 A [100] = { - 1,-1,-1 ..........(100次)}

答案 8 :(得分:1)

我有同样的问题而且我发现了怎么做,文档给出了以下示例:

std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 (not in C++14)

所以我试过了:

std::array<int, 3> a1{ {1} }; // double-braces required in C++11 (not in C++14)

它的作用是所有元素都有1作为值。它不适用于=运算符。这可能是一个C ++ 11问题。

答案 9 :(得分:0)

无法执行您尝试对原始数组执行的操作(除非您在初始化列表中明确列出所有100个-1),您可以使用vector执行此操作:

vector<int> directory(100, -1);

此外,您可以使用上述其他方法之一创建数组并将值设置为-1

答案 10 :(得分:0)

只需使用此循环。

for(int i =0 ; i < 100 ; i++) directory[i] =0;

答案 11 :(得分:0)

全能的memset()将在C / C ++ / C ++ 11 / C ++ 14中为数组和std容器完成工作

答案 12 :(得分:0)

int directory[100] = {-1}不起作用的原因是因为array initialization会发生什么。

  

所有未显式初始化的数组元素的隐式初始化方式与具有静态存储持续时间的对象相同。

implicitly initializedbegin

int

  

初始化为无符号零

     

所有未显式初始化的数组元素的隐式初始化方式与具有静态存储持续时间的对象相同。

C ++ 11引入了专门用于数组的endfill

这意味着给定一个数组(不仅仅是一个指针),就像您的directory一样,您可以使用IBM doc,如以下几个答案所示:

fill(begin(directory), end(directory), -1)

假设您编写了这样的代码,但是在忘记了如何实现它之后决定重用该功能,但您决定将directory的大小更改为60.如果您使用代码编写代码beginend然后你就完成了。
另一方面,如果您这样做了: fill(directory, directory + 100, -1) 那么您最好还记得将100更改为60,否则您将得到未定义的行为。

答案 13 :(得分:0)

如果允许使用std :: array,则可以执行以下操作:

#include <iostream>
#include <algorithm>
#include <array>
using namespace std;

template <class Elem, Elem pattern, size_t S, size_t L>
struct S_internal {
    template <Elem... values>
    static array<Elem, S> init_array() {
        return S_internal<Elem, pattern, S, L - 1>::init_array<values..., pattern>();
    }
};

template <class Elem, Elem pattern, size_t S>
struct S_internal<Elem, pattern, S, 0> {
    template <Elem... values>
    static array<Elem, S> init_array() {
        static_assert(S == sizeof...(values), "");
        return array<Elem, S> {{values...}};
    }
};

template <class Elem, Elem pattern, size_t S>
struct init_array
{
    static array<Elem, S> get() {
        return S_internal<Elem, pattern, S, S>::init_array<>();
    }
};

void main()
{
    array<int, 5> ss = init_array<int, 77, 5>::get();
    copy(cbegin(ss), cend(ss), ostream_iterator<int>(cout, " "));
}

输出结果为:

  

77 77 77 77 77

答案 14 :(得分:0)

只需使用fill_n()方法。

示例

int n;
cin>>n;
int arr[n];
int value = 9;
fill_n(arr, n, value); // 9 9 9 9 9...

Learn More关于fill_n()

您可以使用fill()方法。

示例

int n;
cin>>n;
int arr[n];
int value = 9;
fill(arr, arr+n, value); // 9 9 9 9 9...

Learn More关于fill()方法。

注意:这两种方法在algorithm库(#include<algorithm>)中可用。不要忘记添加它。

答案 15 :(得分:0)

从C ++ 11开始,您还可以使用基于范围的循环:

int directory[10];
for (auto& value: directory) value = -1;