while(数组结束) - 如何识别

时间:2011-07-25 13:10:40

标签: c++ arrays templates while-loop

我有一组数字{1,2,3,4,5}或一组字符或其他。我想写一个模板方法来打印出完整的数组。它有效,只有一些问题。也许我先发布代码:

template <typename A>
void printArray(A start) {
    int i = 0;
    while (start[i] != 0) {
        std::cout << start[i] << std::endl;
        i++;
    }
}

int main(int argc, char **argv) {

    using namespace std;
    int xs[] = {1,2,3,4,5,6,7}; //works
    //int xs[] = {1,0,3,6,7}; of course its not working (because of the 0)
    int *start = xs;

    printArray(start);

    return 0;
}

你能看到问题吗? while(start[i] != 0)不是读取数组结束的最佳方式;)我有什么其他选项?

谢谢!

5 个答案:

答案 0 :(得分:12)

选项1: 传递指针和元素数量

 template<class T>
 void doSth(T* arr, int size)

上行 - 适用于动态和自动数组 下行 - 您必须知道尺寸。你必须通过它。

选项2: 参数化模板,其大小将自动推断

template <class T, int N>
void doSth(T(&arr)[N])

下行 - 无法传递动态数组

选项3: 做一名优秀的程序员并使用std::vector

答案 1 :(得分:11)

由于您使用的是C ++,vector<int>iterators会让您在长途旅行中做得更好。

答案 2 :(得分:6)

如果要使用数组而不是指针,则可以将函数模板编写为:

template <typename T, size_t N>
void printArray(T (&start)[N]) 
{
    int i = 0;
    while ( i < N) {
        std::cout << start[i] << std::endl;
        i++;
    }
}

int xs1[] = {1,2,3,4,5,6,7}; 
int xs2[] = {1,0,3,6,7}; 
printArray(xs1); //okay
printArray(xs2); //okay

int *start = xs1;
printArray(start); //error - cannot pass pointer anymore!

更好的解决方案是:std::vector<T>

甚至更好地使用范围(迭代器对)这是非常惯用的,如:

template <typename FwdIterator>
void printArray(FwdIterator begin, FwdIterator end) 
{
    while (begin != end) {
        std::cout << *begin << std::endl;
        begin++;
    }
}

int xs1[] = {1,2,3,4,5,6,7}; 
int xs2[] = {1,0,3,6,7}; 
printArray(xs1, xs1 + sizeof(xs1)/sizeof(xs1[0])); //okay
printArray(xs2, xs2 + sizeof(xs2)/sizeof(xs2[0])); //okay

int *start = xs1;
printArray(start, start + sizeof(xs1)/sizeof(xs1[0])); //okay!

printArray现在也可以与std::vector<T>一起使用:

std::vector<int> vec; //you can use std::list as well!
//populate vec

printArray(vec.begin(), vec.end());

答案 3 :(得分:2)

传递数组的地址及其长度。

答案 4 :(得分:2)

如果您使用的是编译时数组,则可以使用模板执行此操作:

template <typename T, size_t N>
static inline void print_array(const T (&a)[N])
{
  for (size_t i = 0; i < N; ++i)
    std::cout << a[i] << std::endl;
}

int main()
{
  int a[] = {1,2};
  print_array(a);
}

如果您只需要打印数组,还可以查看pretty printer,它会在内部使用此类内容。