C++ 通用 int 数组和向量迭代器

c++ general int array and vector iterator

在下面的代码中,我需要定义一个可以在 vector<int>int[100] 上迭代的迭代器。这里如何定义mi

template<class arraytype>
void array_show(arraytype array, size_t arraySize)
{
    // how to define mi????
    for (mi = array; array != m.end(); array++)
        std::cout << " " << *mi << std::endl;
}

定义您的函数以接受开始和结束迭代器。然后您可以将您的函数用于任何形式的迭代

template<typename Iter>
void array_show(Iter begin, Iter end)
{
    // how to define mi????
    for (Iter it = begin; it != end; it++)
        std::cout << " " << *it << std::endl;
}

然后您可以按如下方式调用您的函数

int main(int argc, char *argv[]) {
    std::vector<int> vec= { 3, 1, 4, 1, 5, 9, 2, 6 };
    int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6 };
    array_show(vec.begin(), vec.end());
    array_show(std::begin(arr), std::end(arr));


}

如果您想将数组作为引用和向量传递,您应该创建两个不同的函数重载以支持两者。这可能看起来像您的意图,因为您的函数签名旨在接受大小和对象。

template<typename Ty, size_t size>
void array_show(Ty(&arr)[size])
{
    for (size_t i = 0; i < size; i++)
        std::cout << " " << arr[i] << std::endl;
}

并随后将其称为

int arr[] = { 3, 1, 4, 1, 5, 9, 2, 6 };
array_show(arr);

如果您需要按照您展示的方式使用它:

template<class arraytype>
void array_show(arraytype array, size_t arraySize)
{
    auto end = &(array[arraySize]);
    for (mi = &(array[0]); array != end; ++array)
        std::cout << " " << *mi << std::endl;
}

由于 vector 已定义 operator[],构造 &(array[...]) 将适用于 vector 和普通数组。

但最好是:

template <class Iter>
void array_show(Iter begin, Iter end)
{
    for (Iter it = begin, it != end; ++it)
        std::cout << " " << *it << std::endl;
}

然后:

vector<int> vi;
int ai[100];
//fill with data

array_show(vi.begin(). vi.end());
array_show(ai, ai + 100);

尝试以下方法

#include <iostream>
#include <vector>
#include <iterator>

template<class arraytype>
void array_show( const arraytype &array )
{
    for ( const auto &x : array ) std::cout << x << ' ';
    std::cout << std::endl;
}

int main() 
{
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    std::vector<int> v( std::begin( a ), std::end( a ) );

    array_show( a );
    std::endl( std::cout );

    array_show( v );
    std::endl( std::cout );

    return 0;
}

程序输出为

1 2 3 4 5 6 7 8 9 10 

1 2 3 4 5 6 7 8 9 10 

另一种方法是使用迭代器。例如(这里显示了两个函数定义)

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

template<class arraytype>
void array_show( const arraytype &array )
{
    for ( const auto &x : array ) std::cout << x << ' ';
    std::cout << std::endl;
}

template <class InputIterator>
void array_show( InputIterator first, InputIterator last )
{
    typedef typename std::iterator_traits<InputIterator>::value_type value_type;
    std::copy( first, last, 
               std::ostream_iterator<value_type>( std::cout, " ") );

    std::cout << std::endl;     
}

int main() 
{
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    std::vector<int> v( std::begin( a ), std::end( a ) );

    array_show( std::begin( a ), std::end( a ) );
    std::endl( std::cout );

    array_show( std::begin( v ), std::end( v ) );
    std::endl( std::cout );


    return 0;
}

程序输出同上

1 2 3 4 5 6 7 8 9 10 

1 2 3 4 5 6 7 8 9 10 

您可以自己编写一个循环来代替算法 std::copy。例如

template <class InputIterator>
void array_show( InputIterator first, InputIterator last )
{
    for ( ; first != last; ++first )
    {
        std::cout << *first << ' '; 
    }           

    std::cout << std::endl;     
}

下面是一个例子。重要的部分是使用 arraytype& - 一个引用,这样常规数组就不会衰减为指针 - 这样就可以在 array_show.

中读取它的大小
template<class arraytype>
void array_show(arraytype& array, size_t arraySize)
{
    // how to define mi????
    for (auto mi = std::begin(array); mi != std::end(array); mi++)
        std::cout << " " << *mi << std::endl;
}

只需在内置数组上编写带循环的简单函数,然后将指针传递给 std::vector 数据

std::vector<int> a; 
foo(a.data(), a.size());