簡體   English   中英

如何以int形式查找數組的大小

[英]How to find the size of an array as an int

如果答案非常明顯,我深表歉意。 我寫了這小段代碼來初始化數組中的向量

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

該代碼運行良好,唯一讓我煩惱的是必須知道數組大小。 for的第二個參數,

i < 5;

看起來似乎太簡單了,而在更大的代碼中卻不那么准確。 有什么辦法可以讓我的代碼將數組中的元素數推導出為整數,並使用該數字而不是自己聲明實際的元素數? 當使用大多數數組或向量時,我往往會發現這很煩人。 我敢肯定,寫一些可以為我得出答案的東西會是一個更好的習慣,因為我敢肯定,在需要用戶輸入的情況下,這可能會導致計算錯誤,並且對輸入的元素數量沒有限制。

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

要使用數組中的值初始化vector<int> ,可以使用:

int arr[] = {1,2,3,4,5};
vector<int> vec (arr, arr + sizeof(arr) / sizeof(*arr) );

要迭代向量的所有值,可以使用( size()將為您提供向量的大小):

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

ps在C ++ 11中,您甚至可以使用基於范圍的for循環

for (auto elem : vec)
    std::cout << elem;
  • 要獲取數組的大小:

     template <typename T, std::size_t N> constexpr std::size_t array_size(const T(&)[N]) { return N; } 
  • std::vector已經具有成員方法size()

遍歷向量而無需對其大小進行硬編碼:

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

for ( vector<int>::iterator it = vec.begin(); it != vec.end(); ++it )
   cout << *it;

如果您使用的是C ++ 11,

for ( auto item : vec )
   cout < item;

您的代碼的第一部分,

int arr[] = {1,2,3,4,5};
vector<int> vec = {begin(arr), end(arr)}; 

可以確定,假設beginendstd::beginstd::end


下面的循環,

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

在三種方面是不好的:

  • 錯誤的循環,應使用范圍為基礎for

  • 硬編碼大小,應使用vec.size()或同等大小。

  • 不為環體使用撐桿很容易導致維護問題。

更正為普通的C ++ 03 for循環:

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

強制轉換可以抑制關於有符號/無符號不匹配的警告,否則可能會產生警告。

順便說一句,請注意,對於int類型,維護沒有問題,可以更改此強制轉換的含義,或含義與預期不同。

盡管如此,在聰明地自動搜索C樣式轉換時,它仍可能產生誤報。 我個人通過使用count_of函數來避免這種count_of 因此,如果我出於某種原因選擇了C ++ 03 for循環,我會寫類似

for( int i = 0; i < count_of( vec ); ++i )
{
    cout << vec[i];
}

但是,您可以簡單地將C ++ 11基於范圍for ,如下所示:

for( auto const value : vec )
{
    cout << value;
}

在確實需要容器的帶符號整數大小(可能是原始數組)的地方,請考慮利用std::beginstd::end

#include <stddef.h>  // ptrdiff_t
#Include <iterator>  // std::begin, std::end

using Size = ptrdiff_t;

template< class Container >
auto count_of( Container& c )
    -> Size
{ return std::end( c ) - std::begin( c ); }

我不確定專門針對原始數組是否值得,但是如果您需要constexpr ,則需要這樣做,例如

template< class Item, Size n >
auto constexpr count_of( Item (&a)[n] )
    -> Size
{ return n; }

免責聲明:編譯器未觸及任何代碼。

出於完整性考慮:此問題是為std::array創建的。 (C ++ 11)

// 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM