目錄
一、代碼
二、詳細解釋
1.?print?函數模板
2.?array_size?函數模板
3.?print1?函數模板
4.?print2?函數模板
5.?my_begin?和?my_end?函數模板
6.?print3?函數模板
7.?main?函數
總結
一、代碼
如下代碼給出了5種方式打印任意類型任意長度的數組。這段代碼定義了多個模板函數,用于處理數組的相關操作,包括計算數組大小、打印數組元素等。在?main
?函數中,創建了一個整數數組?a
?和一個字符串數組?vs
,并使用不同的方式計算數組大小和打印數組元素。
#include<iostream>
#include<string>template<typename T>
void print(const T* begin,const T* end)
{while(begin != end)std::cout<<*begin++<<" ";std::cout<<std::endl;
}template<typename T>
void print(const T ta[],size_t size)
{for(size_t i = 0;i != size; i++)std::cout<<ta[i]<<" ";std::cout<<std::endl;
}template<typename T,unsigned int N>
constexpr unsigned int array_size(const T (&arr)[N])
{return N;
}template<typename T,unsigned int N>
void print1(const T (&arr)[N])
{for(size_t i = 0;i < N;i++)std::cout<<arr[i]<<" ";std::cout<<std::endl;
}template<typename T,unsigned int N>
void print2(const T (&arr)[N])
{for(const auto &e : arr)std::cout<<e<<" ";std::cout<<std::endl;
}template<typename T,unsigned int N>
const T* my_begin(const T (&arr)[N])
{return &arr[0];
}template<typename T,unsigned int N>
const T* my_end(const T (&arr)[N])
{return arr + N;
}template<typename T,unsigned int N>
void print3(const T (&arr)[N])
{for(auto it = my_begin(arr);it != my_end(arr);it++)std::cout<<*it<<" ";std::cout<<std::endl;
}int main(int argc, char* argv[])
{int a[6] = {0,2,4,6,8,10};std::string vs[3] = {"Hello","World","!"};std::cout<<"1 size of a is:"<<array_size(a)<<std::endl;std::cout<<"2 size of a is:"<<sizeof(a)/sizeof(int)<<std::endl;std::cout<<"3 size of a is:"<<std::end(a) - std::begin(a)<<std::endl;std::cout<<"4 size of a is:"<<my_end(a) - my_begin(a)<<std::endl;std::cout<<"1-----------------------"<<std::endl;print(std::begin(a),std::end(a));print(std::begin(vs),std::end(vs));std::cout<<"2-----------------------"<<std::endl;print(a,std::end(a) - std::begin(a));print(vs,std::end(vs) - std::begin(vs));std::cout<<"3-----------------------"<<std::endl;print1(a);print1(vs);std::cout<<"4-----------------------"<<std::endl;print2(a);print2(vs);std::cout<<"5-----------------------"<<std::endl;print3(a);print3(vs);return 0;
}
輸出
1 size of a is:6
2 size of a is:6
3 size of a is:6
4 size of a is:6
1-----------------------
0 2 4 6 8 10
Hello World !
2-----------------------
0 2 4 6 8 10
Hello World !
3-----------------------
0 2 4 6 8 10
Hello World !
4-----------------------
0 2 4 6 8 10
Hello World !
5-----------------------
0 2 4 6 8 10
Hello World !
print1和print2只需要傳入數組就可以。推薦使用。
二、詳細解釋
1.?print
?函數模板
template<typename T>
void print(const T* begin, const T* end)
{while(begin != end)std::cout << *begin++ << " ";std::cout << std::endl;
}
- 該函數接受兩個指向數組元素的指針?
begin
?和?end
,通過遍歷從?begin
?到?end
?的元素,將其輸出到標準輸出流,并在最后換行。
template<typename T>
void print(const T ta[], size_t size)
{for(size_t i = 0; i != size; i++)std::cout << ta[i] << " ";std::cout << std::endl;
}
- 此函數接受一個數組?
ta
?和數組的大小?size
,通過循環遍歷數組元素并輸出,最后換行。
2.?array_size
?函數模板
template<typename T, unsigned int N>
constexpr unsigned int array_size(const T (&arr)[N])
{return N;
}
- 該函數接受一個數組的引用?
arr
,利用模板參數?N
?來獲取數組的大小,并返回該大小。constexpr
?表示該函數可以在編譯時求值。
3.?print1
?函數模板
template<typename T, unsigned int N>
void print1(const T (&arr)[N])
{for(size_t i = 0; i < N; i++)std::cout << arr[i] << " ";std::cout << std::endl;
}
- 該函數接受一個數組的引用?
arr
,通過循環遍歷數組元素并輸出,最后換行。
4.?print2
?函數模板
template<typename T, unsigned int N>
void print2(const T (&arr)[N])
{for(const auto &e : arr)std::cout << e << " ";std::cout << std::endl;
}
- 此函數使用范圍?
for
?循環遍歷數組?arr
?中的每個元素?e
,并將其輸出到標準輸出流,最后換行。
5.?my_begin
?和?my_end
?函數模板
template<typename T, unsigned int N>
const T* my_begin(const T (&arr)[N])
{return &arr[0];
}template<typename T, unsigned int N>
const T* my_end(const T (&arr)[N])
{return arr + N;
}
my_begin
?函數返回數組?arr
?的第一個元素的地址。my_end
?函數返回數組?arr
?最后一個元素之后的地址。
6.?print3
?函數模板
template<typename T, unsigned int N>
void print3(const T (&arr)[N])
{for(auto it = my_begin(arr); it != my_end(arr); it++)std::cout << *it << " ";std::cout << std::endl;
}
- 該函數使用自定義的?
my_begin
?和?my_end
?函數來獲取數組的起始和結束指針,通過指針遍歷數組元素并輸出,最后換行。
7.?main
?函數
int main(int argc, char* argv[])
{int a[6] = {0, 2, 4, 6, 8, 10};std::string vs[3] = {"Hello", "World", "!"};std::cout << "1 size of a is:" << array_size(a) << std::endl;std::cout << "2 size of a is:" << sizeof(a) / sizeof(int) << std::endl;std::cout << "3 size of a is:" << std::end(a) - std::begin(a) << std::endl;std::cout << "4 size of a is:" << my_end(a) - my_begin(a) << std::endl;std::cout << "1-----------------------" << std::endl;print(std::begin(a), std::end(a));print(std::begin(vs), std::end(vs));std::cout << "2-----------------------" << std::endl;print(a, std::end(a) - std::begin(a));print(vs, std::end(vs) - std::begin(vs));std::cout << "3-----------------------" << std::endl;print1(a);print1(vs);std::cout << "4-----------------------" << std::endl;print2(a);print2(vs);std::cout << "5-----------------------" << std::endl;print3(a);print3(vs);return 0;
}
- 在?
main
?函數中,創建了一個整數數組?a
?和一個字符串數組?vs
。 - 使用不同的方式計算數組?
a
?的大小并輸出。 - 分別使用不同的?
print
?函數模板來打印數組?a
?和?vs
?的元素。
總結
這段代碼展示了如何使用模板函數來處理數組的大小計算和元素打印,同時演示了不同的遍歷數組的方式。通過使用模板函數,可以提高代碼的復用性,使其適用于不同類型的數組。