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

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