一个C++小题目
不用循环和条件控制语句,怎样打印出 1 到 1000 这些数。
微博上看到有人给出的这个问题的答案,没理解,就自己运行了下。代码如下:
class A
{
public:
static int SUM;
A(){}
~A(){
cout << 501-SUM <<" ";
SUM--;
}
};
int A::SUM = 500;
int _tmain(int argc, _TCHAR* argv[])
{
{
vector b(500);
cout << "Done\n";
}
system("pause");
return 0;
}
从结果看到,确实是从 1 打印到 1000。
关键在于 main
函数中 vector
容器的初始化。
我前几天刚看了 TICPP 也没记住什么,不知道 vector
如何初始化对象的。
写了一些代码,发现 vector
调用默认构造函数生成一个临时对象,在用拷贝构造函数将临时对象放入 vector
中,接着销毁临时对象。
所以才会出现上面的程序中,vector
有500个对象,但析构函数被调用了 1000 次。
刚看了 STL 算法这部分的内容,正好可以解决这道题目。
用 generate_n
结合声称其函数生成 1 到 1000 的 vector
容器,再用 copy
算法和 ostream_iterator
迭代器打印容器内容。
代码如下:
class IntIncrease{
int i;
public:
IntIncrease(int num): i(num) {}
int operator()(){
return i++;
}
};
template
void printContainer(Iter first, Iter last, const char* sep = " ",
std::ostream& os = std::cout)
{
typedef typename std::iterator_traits::value_type T;
std::copy(first,last, std::ostream_iterator(std::cout, sep));
os<<std::endl;
}
int _tmain(int argc, _tchar* argv[])
{
vector<int> myint;
const int TOTAL_NUMS = 1000;
generate_n(back_inserter(myint), TOTAL_NUMS, IntIncrease(1));
printContainer(myint.begin(), myint.end(), " ");
system("pause");
return 0;
}
这个比上一个麻烦一点儿。