C++ 如何找到数组的整数大小

C++ 如何找到数组的整数大小,c++,arrays,vector,integer,C++,Arrays,Vector,Integer,如果答案非常明显,我很抱歉。 我写了一小段代码,用于初始化数组中的向量 int arr[] = {1,2,3,4,5}; vector<int> vec = {begin(arr), end(arr)}; for (int i = 0; i < 5; ++i) cout << vec[i]; intarr[]={1,2,3,4,5}; 向量vec={begin(arr),end(arr)}; 对于(int i=0;i

如果答案非常明显,我很抱歉。 我写了一小段代码,用于初始化数组中的向量

int arr[] = {1,2,3,4,5};
  vector<int> vec = {begin(arr), end(arr)};
  for (int i = 0; i < 5; ++i)
        cout << vec[i];
intarr[]={1,2,3,4,5};
向量vec={begin(arr),end(arr)};
对于(int i=0;i<5;++i)

cout要获取
int arr[]
的大小,可以使用
sizeof(arr)/sizeof(*arr)

要使用数组中的值初始化
向量
,可以使用:

int arr[] = {1,2,3,4,5};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(*arr) );
p.s.在C++11中,您甚至可以使用:

for(自动元素:vec)

std::cout要获取
int-arr[]
的大小,可以使用
sizeof(arr)/sizeof(*arr)

要使用数组中的值初始化
向量
,可以使用:

int arr[] = {1,2,3,4,5};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(*arr) );
p.s.在C++11中,您甚至可以使用:

for(自动元素:vec)

std::cout在不硬编码其大小的情况下迭代向量:

for (int i = 0; i < vec.size(); ++i)
   cout << vec[i];

for ( vector<int>::iterator it = vec.begin(); it != vec.end(); ++it )
   cout << *it;
for(int i=0;icout在不硬编码其大小的情况下迭代向量:

for (int i = 0; i < vec.size(); ++i)
   cout << vec[i];

for ( vector<int>::iterator it = vec.begin(); it != vec.end(); ++it )
   cout << *it;
for(int i=0;i
  • 要获取阵列的大小,请执行以下操作:

    template <typename T, std::size_t N>
    constexpr std::size_t array_size(const T(&)[N]) { return N; }
    
    模板
    constexpr std::size\u t数组大小(const t(&)[N]){return N;}
    
  • std::vector
    已经有一个成员方法
    size()

      • 要获取阵列的大小,请执行以下操作:

        template <typename T, std::size_t N>
        constexpr std::size_t array_size(const T(&)[N]) { return N; }
        
        模板
        constexpr std::size\u t数组大小(const t(&)[N]){return N;}
        
      • std::vector
        已经有一个成员方法
        size()


        • 代码的第一部分

          int arr[] = {1,2,3,4,5};
          vector<int> vec = {begin(arr), end(arr)}; 
          
          在三个方面都是不好的:

          • 错误循环,应使用基于范围的
            for

          • 硬编码尺寸,应使用
            vec.size()
            或等效物

          • 环体不使用支架容易导致维护问题

          更正为普通C++03
          for
          循环:

          for (int i = 0; i < (int)vec.size(); ++i)
          {
              cout << vec[i];
          }
          
          但是,您只需将基于C++11范围的
          用于
          ,如下所示:

          for( auto const value : vec )
          {
              cout << value;
          }
          
          我不确定专门针对原始数组是否值得,但如果您需要
          constexpr
          ,则需要这样做,例如

          template< class Item, Size n >
          auto constexpr count_of( Item (&a)[n] )
              -> Size
          { return n; }
          
          模板
          (项目(&a)[n]的自动constexpr计数
          ->大小
          {返回n;}
          

          免责声明:编译器未涉及任何代码。

          您的代码的第一部分

          int arr[] = {1,2,3,4,5};
          vector<int> vec = {begin(arr), end(arr)}; 
          
          在三个方面都是不好的:

          • 错误循环,应使用基于范围的
            for

          • 硬编码尺寸,应使用
            vec.size()
            或等效物

          • 环体不使用支架容易导致维护问题

          更正为普通C++03
          for
          循环:

          for (int i = 0; i < (int)vec.size(); ++i)
          {
              cout << vec[i];
          }
          
          但是,您只需将基于C++11范围的
          用于
          ,如下所示:

          for( auto const value : vec )
          {
              cout << value;
          }
          
          我不确定专门针对原始数组是否值得,但如果您需要
          constexpr
          ,则需要这样做,例如

          template< class Item, Size n >
          auto constexpr count_of( Item (&a)[n] )
              -> Size
          { return n; }
          
          模板
          (项目(&a)[n]的自动constexpr计数
          ->大小
          {返回n;}
          

          免责声明:编译器未涉及任何代码。

          为了完整性:此问题是为解决此问题而创建的。(C++11)

          //这是静态分配的,与向量不同
          //它使用动态分配的内存。
          数组arr={1,2,3,4,5};
          //不同的迭代方法:
          用于(自动和电气:arr){
          
          cout完整性:这个问题就是为它创建的。(C++11)

          //这是静态分配的,与向量不同
          //它使用动态分配的内存。
          数组arr={1,2,3,4,5};
          //不同的迭代方法:
          用于(自动和电气:arr){
          
          cout
          vector
          有这样一个函数。std::array
          也有这样一个函数,您应该使用它来代替内置数组。
          vector
          还允许您使用初始值设定项列表,因此数组无论如何都是无意义的。您通常会使用ranged for循环或算法,因此知道大小也没有意义。@chris:
          std::array
          要求您指定大小(或者您应该实现一个
          make_array
          )。@Jarod42,内置数组也是如此。@chris:不,正如OP的示例
          int arr[]={1,2,3,4,5}
          ,您没有(明确地)指定大小为
          5
          @Jarod42,您从未明确说过。您仍然通过初始值设定项列表提供大小,就像使用
          make_array
          时一样
          vector
          具有此功能。
          std::array
          ,您应该使用它来代替内置数组。
          vector
          也允许您使用它使用初始值设定项列表,因此数组无论如何都是无意义的。通常情况下,您会使用范围for循环或算法,因此知道大小也是无意义的。@chris:
          std::array
          要求您指定大小(或者您应该实现
          make\u array
          ).@Jarod42,内置数组也是。@chris:不,就像OP的例子
          int-arr[]={1,2,3,4,5}
          ,你没有(显式地)指定大小为
          5
          @Jarod42,您从未明确说过。您仍然通过初始值设定项列表提供大小,就像使用
          make_array
          -1表示单个小NIT的总和一样。表达式
          sizeof(arr)/sizeof(arr[0])
          非常详细(1)和(2)键入不安全,因为它接受一个指针作为
          arr
          ,然后产生错误的结果。与OP的代码相比,向量的初始化是不必要的冗长和复杂。for
          循环可能会产生一个有符号/无符号警告,这是不正确的。-1表示单个小NIT的总和。表达式
          sizeof(arr)/sizeof(arr[0])
          是(1)非常冗长的,(2)类型不安全的,因为它接受一个指针作为
          arr
          ,然后产生错误的结果。与OP的代码相比,向量的初始化是不必要的冗长和复杂。for
          循环可能产生一个有符号/无符号的警告,这是不正确的。
          // This is statically allocated, unlike vector 
          // which uses dynamic allocated memory.
          std::array<int, 5> arr = {1, 2, 3, 4, 5}; 
          
          // Different iterations methods:
          for ( auto & elem : arr ) {
              cout << elem << endl;
          }
          
          for ( int i = 0; i < arr.size(); i++) {
              cout << arr[i] << endl;
          }
          
          for ( auto it = arr.begin(); it != arr.end(); ++it) {
              cout << *it << endl;
          }