一个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;
}

这个比上一个麻烦一点儿。