[英]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)};
可以確定,假設begin
和end
是std::begin
和std::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::begin
和std::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.