将标准容器传递给函数
Pass a std container to a function
我得出以下结论:
template <typename T> inline void printcontainer( std::vector<T> container )
{
for( auto it = container.begin(); it != container.end(); it++ )
{
std::cout << *it << std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(3);
printcontainer(v);
return 0;
}
(抱歉 push_backs
,visual studio 不接受初始化列表...呃!!)
现在这个功能仅限于std::vector
,我怎样才能让它能够传递其他容器,比如std::list
数组等等...
简单地不要模板化容器存储的类型,而是容器本身的类型:
template <typename Container>
inline void printcontainer(const Container &container)
请注意,我将参数更改为 const
引用以避免不必要的复制。
您可以使用 non-member std::begin
和 std::end
或使用 range based for
loop:
将您的打印函数推广到 C 数组
template <typename Container>
inline void printcontainer(const Container &container) {
for (const auto &v : container)
std::cout << v << "\n";
}
OT备注:你可能不需要这里的inline
。
传递容器对象违反了经典的 Stepanov 的 STL container-iterator-algorithm 通用编程风格。
通常一个人会传递迭代器:
# define ForwardIterator typename // workaround untill we have concepts
template <ForwardIterator It> inline void printcontainer( It begin, It end )
{
for(;begin != end; ++begin)
{
std::cout << *begin << std::endl;
}
}
用法:
std::vector<int> v = {1, 2, 3, 4};
printcontainer(v.cbegin(), v.cend());
我得出以下结论:
template <typename T> inline void printcontainer( std::vector<T> container )
{
for( auto it = container.begin(); it != container.end(); it++ )
{
std::cout << *it << std::endl;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> v;
v.push_back(5);
v.push_back(4);
v.push_back(3);
printcontainer(v);
return 0;
}
(抱歉 push_backs
,visual studio 不接受初始化列表...呃!!)
现在这个功能仅限于std::vector
,我怎样才能让它能够传递其他容器,比如std::list
数组等等...
简单地不要模板化容器存储的类型,而是容器本身的类型:
template <typename Container>
inline void printcontainer(const Container &container)
请注意,我将参数更改为 const
引用以避免不必要的复制。
您可以使用 non-member std::begin
和 std::end
或使用 range based for
loop:
template <typename Container>
inline void printcontainer(const Container &container) {
for (const auto &v : container)
std::cout << v << "\n";
}
OT备注:你可能不需要这里的inline
。
传递容器对象违反了经典的 Stepanov 的 STL container-iterator-algorithm 通用编程风格。
通常一个人会传递迭代器:
# define ForwardIterator typename // workaround untill we have concepts
template <ForwardIterator It> inline void printcontainer( It begin, It end )
{
for(;begin != end; ++begin)
{
std::cout << *begin << std::endl;
}
}
用法:
std::vector<int> v = {1, 2, 3, 4};
printcontainer(v.cbegin(), v.cend());