如何将数组的大小作为int来查找

时间:2014-07-12 03:09:10

标签: 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];

代码工作正常,唯一让我烦恼的是必须知道数组大小。 for的第二个参数,

i < 5;

看起来有点过于简单,而且在更大的代码中也不那么准确。有什么方法可以让代码将数组中的元素数量推导为整数并使用它而不是自己说明实际的元素数量?当使用大多数数组或向量时,我倾向于发现这很烦人。我确信写一些会为我推断出答案的东西会更好,因为我确信它可能会导致用户输入需要误算的错误,并且他们输入的元素数量没有限制。

5 个答案:

答案 0 :(得分:3)

要获得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];

p.s。在C ++ 11中,您甚至可以使用range-based for loop

for (auto elem : vec)
    std::cout << elem;

答案 1 :(得分:2)

  • 获取数组的大小:

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

答案 2 :(得分:1)

迭代向量而不对其大小进行硬编码:

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;

答案 3 :(得分:1)

代码的第一部分,

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来避免它。因此,如果我出于某种原因选择了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; }

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

答案 4 :(得分:0)

为了完整性:此问题是为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;
}