在用到DevC++编译C++中的容器时,出现了一个错误。如下:

E:\C编程学习\1024\11161242.cpp    [Error] in C++98 's1' must be initialized by constructor, not by '{...}'

代码没有任何问题,后来上网查证了一下,原来是DevC++的编译器没有支持C++11,因此只需要更改即可。

更改方法:

工具->编译选项

语言标准 设置ISO C++ 11

其实不更改,也可以正常实现代码功能,只是不能使用template T 的输出,也就是必须一个一个地写输出函数才行,就比如下面的代码使用迭代器iterator,一个个写输出函数也是没问题的。

#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
//template <typename T>
//void showvector(vector<T> v)
//{
//    for (vector<T>::iterator it = v.begin(); it != v.end(); it++)
//    {
//        cout << *it;
//    }
//    cout << endl;
//}
 
int main()
{
    vector<string> v6(7,"s");
    v6.resize(3);  //重新调整vector容量大小
    for (vector<string>::iterator it = v6.begin(); it != v6.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
 
    vector<int> v5(10,6); //列表初始化,注意使用的是花括号
    cout << v5.front() << endl; //访问第一个元素
    cout << v5.back() << endl; //访问最后一个元素
 
    for (vector<int>::iterator it = v5.begin(); it != v5.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
    v5.pop_back(); //删除最后一个元素
    for (vector<int>::iterator it = v5.begin(); it != v5.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
    v5.push_back(6); //加入一个元素并把它放在最后
    for (vector<int>::iterator it = v5.begin(); it != v5.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
    v5.insert(v5.begin()+1,9); //在第二个位置插入新元素
    for (vector<int>::iterator it = v5.begin(); it != v5.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
    v5.erase(v5.begin() + 3);  //删除第四个元素
    for (vector<int>::iterator it = v5.begin(); it != v5.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
    v5.insert(v5.begin() + 1, 7,8); //连续插入7个8
    for (vector<int>::iterator it = v5.begin(); it != v5.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
    v5.clear(); //清除所有内容
    for (vector<int>::iterator it = v5.begin(); it != v5.end(); it++)
    {
        cout << *it;
    }
 	cout << endl;
    system("pause");
    return 0;
} 

/*
sss
6
6
6666666666
666666666
6666666666
69666666666
6966666666
68888888966666666

请按任意键继续. . .

*/

但是,这样带来的典型问题就是代码不够优化,太冗杂。template的好处就是可以使输出函数的输入数据类型具有多态性。

下面时优化的代码:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
template <typename T>
void showvector(vector<T> v)
{
    for (typename vector<T>::iterator it = v.begin(); it != v.end(); it++)
    {
        cout << *it;
    }
    cout << endl;
}
 
int main()
{
    vector<string> v6 = { "hi","my","name","is","lee" };
    v6.resize(3);  //重新调整vector容量大小
    showvector(v6);
 
    vector<int> v5 = { 1,2,3,4,5 }; //列表初始化,注意使用的是花括号
    cout << v5.front() << endl; //访问第一个元素
    cout << v5.back() << endl; //访问最后一个元素
 
    showvector(v5);
    v5.pop_back(); //删除最后一个元素
    showvector(v5);
    v5.push_back(6); //加入一个元素并把它放在最后
    showvector(v5);
    v5.insert(v5.begin()+1,9); //在第二个位置插入新元素
    showvector(v5);
    v5.erase(v5.begin() + 3);  //删除第四个元素
    showvector(v5);
    v5.insert(v5.begin() + 1, 7,8); //连续插入7个8
    showvector(v5);
    v5.clear(); //清除所有内容
    showvector(v5);
 
    system("pause");
    return 0;
} 
/*
output:
himyname
1
5
12345
1234
12346
192346
19246
188888889246

请按任意键继续. . .
 
*/ 

这里要注意showvector()里面的迭代器iterator需要使用typename,否则会有一下的错误提醒:

E:\C编程学习\1024\111622209.cpp	[Error] need 'typename' before 'std::vector<T>::iterator' because 'std::vector<T>' is a dependent scope

不过根据提醒也能猜得出来。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐