template <class T, size_t N>
size_t GetArraySize(T (&)[N])
{
return N;
}
T[] 形式で表せる、配列の要素数を取得する関数です。この関数を
std::vectorやstd::list の形式の要素数も取得できるようにしたいのですが
どのように書いたらいいのでしょうか?
↓こんだけのことですかいのぅ...
#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <set>
template <class T, size_t N> inline
size_t GetArraySize(T (&)[N])
{ return N; }
template <class Container> inline
size_t GetArraySize(const Container& c)
{ return c.size(); }
int main() {
int a[] = { 1, 2, 3, 4, 5, 6, 7 };
std::vector<int> v(a,a+6);
std::list<int> l(a,a+5);
std::deque<int> d(a,a+4);
std::set<int> s(a,a+3);
std::cout << GetArraySize(a) << std::endl;
std::cout << GetArraySize(v) << std::endl;
std::cout << GetArraySize(l) << std::endl;
std::cout << GetArraySize(d) << std::endl;
std::cout << GetArraySize(s) << std::endl;
}
多重定義すればいいと思うぞ (特殊化では不可能なので)
vector ならまだしも list の size を取ることに実用的意味があるか?と問うてみる。
俺ならやらない。
もうひとつの解法: T[] なんか捨てちまえ。
代わりに array<T,N> 使う。
そうすればどんなコンテナでも size() でおっけぃ。
// VC++ 2008 (VC9)
#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <deque>
#include <set>
namespace std { using namespace std::tr1; }
int main() {
std::array<int,7> a = {{ 1, 2, 3, 4, 5, 6, 7 }};
std::vector<int> v(a.begin(),a.begin()+6);
std::list<int> l(a.begin(),a.begin()+5);
std::deque<int> d(a.begin(),a.begin()+4);
std::set<int> s(a.begin(),a.begin()+3);
std::cout << a.size() << std::endl;
std::cout << v.size() << std::endl;
std::cout << l.size() << std::endl;
std::cout << d.size() << std::endl;
std::cout << s.size() << std::endl;
}
tetrapod さん、επιστημη さん、ありがとうございました。
もう一点質問させてください。
επιστημη さんの書かれた、「C++ テンプレートテクニック」の見よう見まねで勉強して
いるのですが、思い通りにならなくて困っています。
template<class Iterator_First, class Iterator_Second, int N>
void Deviation<Iterator_First, Iterator_Second, N>::
Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N )
この関数を
T[]型に対応させるため、iterator_traits を使って書く方法を教えたいただけないで
しょうか。
#include <iostream>
#include <vector>
#include <iterator>
#include <utility>
template<class Iterator_First, class Iterator_Second, int N>
class Deviation {
private:
int deviation_;
public:
Deviation() : deviation_(0){}
void Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N = 10);
};
template<class Iterator_First, class Iterator_Second, int N>
void Deviation<Iterator_First, Iterator_Second, N>::
Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N )
{
while(iter_pair_first.first != iter_pair_first.second)
{
deviation_ = *iter_pair_first.first - *iter_pair_second.first;
std::cout << deviation_ << \n;
++iter_pair_first.first;
++iter_pair_second.first;
}
}
using namespace std;
int main()
{
vector<int> v_first; vector<int> v_second;
v_first.push_back(1); v_second.push_back(2);
v_first.push_back(2); v_second.push_back(4);
v_first.push_back(3); v_second.push_back(1);
v_first.push_back(4); v_second.push_back(3);
v_first.push_back(5); v_second.push_back(7);
v_first.push_back(6); v_second.push_back(6);
v_first.push_back(7); v_second.push_back(5);
v_first.push_back(8); v_second.push_back(10);
v_first.push_back(9); v_second.push_back(8);
v_first.push_back(10); v_second.push_back(9);
int deviation = 0;
int array_size_first;
int array_size_second;
Deviation<vector<int>::iterator, vector<int>::iterator, 10> dev;
dev.Diff(make_pair(v_first.begin(), v_first.end()), make_pair(v_second.begin(),
v_second.end()), 10);
int array_1st[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int array_2nd[] = {2, 4, 1, 3, 7, 6, 5, 10, 8, 9};
// この型変換の方法がわかりません
// dev.Diff(make_pair(array_1st, array_1st+10), make_pair(array_2nd,
array_2nd+10), 10);
cout << deviation << \n;
return 0;
}
↓よぉわからんが。
int array_1st[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int array_2nd[] = {2, 4, 1, 3, 7, 6, 5, 10, 8, 9};
Deviation<int*,int*,10> adev;
adev.Diff(make_pair(array_1st, array_1st+10), make_pair
(array_2nd,array_2nd+10), 10);
επιστημη さん、お世話になります。
make_pair で型を指定すればできたんですね。
そっちでしたか・・・
勉強になりました、ありがとうございました。
> make_pair で型を指定すればできたんですね。
ハァ?