#include<iomanip>
#include<fstream>
#include<string>
#include<vector>
#include<deque>
#include<queue>
#include<list>
#include<stack>
#include<set>
#include<algorithm>
#include<functional>
using namespace std;
//自定义排序函数
bool SortMyVeLIDe(const int & vL1, const int & vL2) {
return vL1 > vL2; //降序
}
bool SortMyVeLIIn(const int & vL1, const int & vL2) {
return vL1 < vL2;//升序
}
template<class T>
void PrintVecLI(T & vecli) {
T::iterator it= vecli.begin();
for ( ; it != vecli.end() ; it++)
{
cout << *it << endl;
}
}
template<class T>
void SortMyVeLI(T & vecli) {
bool nFlag;
cout << "请选择想要排序的规则, 升序输入1,降序输入0" << endl;
cin >> nFlag;
//nFlag=0 降序
if (0 == nFlag)
{
cout << "降序" << endl;
sort(vecli.begin(), vecli.end(), SortMyVeLIDe);
}
//nFlag=1 降序
else {
cout << "升序" << endl;
sort(vecli.begin(), vecli.end(), SortMyVeLIIn);
}
}
template<class T>
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
vecli.insert(vecli.begin() + nIndex, nData);
else
cout << "索引超出范围!" << endl;
}
template<class T>
void DeleteData(T & vecli) {
int nIndex;
cout << "请输入要删除的元素索引:" << endl;
cin >> nIndex;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
{
T::iterator it = vecli.begin() + nIndex;
it = vecli.erase(it);
}
else
cout << "索引超出范围!" << endl;
}
void main() {
vector<int> Vec;
for (int i = 0; i < 10; i++)
{
Vec.push_back(rand() % 20);
cout << Vec[i] << endl;
}
SortMyVeLI<vector<int>>(Vec);
PrintVecLI<vector<int>>(Vec);
InsertData<vector<int>>(Vec);
PrintVecLI<vector<int>>(Vec);
DeleteData<vector<int>>(Vec);
PrintVecLI<vector<int>>(Vec);
cout << endl << endl;
list<int> MyList;
for (int i = 0; i < 10; i++)
{
MyList.push_back(rand() % 20);
}
SortMyVeLI<list<int>>(MyList);
PrintVecLI<list<int>>(MyList);
InsertData<list<int>>(MyList);
PrintVecLI<list<int>>(MyList);
DeleteData<list<int>>(MyList);
PrintVecLI<list<int>>(MyList);
}
下面是编译错误
d:\learning\大一下\c++\practice\practice\源.cpp(56): warning C4018: “<=”: 有符号/无符号不匹配
1> d:\learning\大一下\c++\practice\practice\源.cpp(93): note: 参见对正在编译的函数 模板 实例化“void InsertData<std::vector<int,std::allocator<_Ty>>>(T &)”的引用
1> with
1> [
1> _Ty=int,
1> T=std::vector<int,std::allocator<int>>
1> ]
1>d:\learning\大一下\c++\practice\practice\源.cpp(66): warning C4018: “<=”: 有符号/无符号不匹配
1> d:\learning\大一下\c++\practice\practice\源.cpp(95): note: 参见对正在编译的函数 模板 实例化“void DeleteData<std::vector<int,std::allocator<_Ty>>>(T &)”的引用
1> with
1> [
1> _Ty=int,
1> T=std::vector<int,std::allocator<int>>
1> ]
9 个解决方案
#1
求大佬帮忙 谢谢大家
#3
试了试 问题就出现在 SortMyVeLI<vector<int>>(Vec);
InsertData<vector<int>>(Vec);
DeleteData<vector<int>>(Vec);
这三个模版函数 编译时 就会出错
InsertData<vector<int>>(Vec);
DeleteData<vector<int>>(Vec);
这三个模版函数 编译时 就会出错
#4
我一开始以为只是sort list和vector的方法函数不一样导致的 注释后发现 insert 和delete也出错 找不出来了 才刚接触stl
#5
vecli.insert(vecli.begin() + nIndex, nData);这句话里面的nData的类型在编译的时候推倒不出来吧
#6
vecli.begin() + nIndex
vector的迭代器有+index的操作,但是list的迭代器没有
vector的迭代器有+index的操作,但是list的迭代器没有
#7
template<class T>
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
T::iterator it = T.begin();
for (int i = 0; i < nIndex; i++)
it++;
vecli.insert(it, nData);
else
cout << "索引超出范围!" << endl;
}
依旧编译错误。。
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
T::iterator it = T.begin();
for (int i = 0; i < nIndex; i++)
it++;
vecli.insert(it, nData);
else
cout << "索引超出范围!" << endl;
}
依旧编译错误。。
#8
template <typename Container>
void InsertData(Container & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size())) {
typename Container::iterator it = vecli.begin();
for (int i = 0; i < nIndex; i++)
{
it++;
}
vecli.insert(it, nData);
}
else
cout << "索引超出范围!" << endl;
}
终于弄好了 原来是 在编译时Container::iterator 不能认为是一种数据类型 要在前面加上typename才行
谢谢大家
void InsertData(Container & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size())) {
typename Container::iterator it = vecli.begin();
for (int i = 0; i < nIndex; i++)
{
it++;
}
vecli.insert(it, nData);
}
else
cout << "索引超出范围!" << endl;
}
终于弄好了 原来是 在编译时Container::iterator 不能认为是一种数据类型 要在前面加上typename才行
谢谢大家
#9
结贴啦 问题解决了
#1
求大佬帮忙 谢谢大家
#2
#3
试了试 问题就出现在 SortMyVeLI<vector<int>>(Vec);
InsertData<vector<int>>(Vec);
DeleteData<vector<int>>(Vec);
这三个模版函数 编译时 就会出错
InsertData<vector<int>>(Vec);
DeleteData<vector<int>>(Vec);
这三个模版函数 编译时 就会出错
#4
我一开始以为只是sort list和vector的方法函数不一样导致的 注释后发现 insert 和delete也出错 找不出来了 才刚接触stl
#5
vecli.insert(vecli.begin() + nIndex, nData);这句话里面的nData的类型在编译的时候推倒不出来吧
#6
vecli.begin() + nIndex
vector的迭代器有+index的操作,但是list的迭代器没有
vector的迭代器有+index的操作,但是list的迭代器没有
#7
template<class T>
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
T::iterator it = T.begin();
for (int i = 0; i < nIndex; i++)
it++;
vecli.insert(it, nData);
else
cout << "索引超出范围!" << endl;
}
依旧编译错误。。
void InsertData(T & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size()))
T::iterator it = T.begin();
for (int i = 0; i < nIndex; i++)
it++;
vecli.insert(it, nData);
else
cout << "索引超出范围!" << endl;
}
依旧编译错误。。
#8
template <typename Container>
void InsertData(Container & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size())) {
typename Container::iterator it = vecli.begin();
for (int i = 0; i < nIndex; i++)
{
it++;
}
vecli.insert(it, nData);
}
else
cout << "索引超出范围!" << endl;
}
终于弄好了 原来是 在编译时Container::iterator 不能认为是一种数据类型 要在前面加上typename才行
谢谢大家
void InsertData(Container & vecli) {
int nIndex;
int nData;
cout << "请输入要增加的元素索引及元素:" << endl;
cin >> nIndex >> nData;
if ((nIndex >= 0) && (nIndex <= vecli.size())) {
typename Container::iterator it = vecli.begin();
for (int i = 0; i < nIndex; i++)
{
it++;
}
vecli.insert(it, nData);
}
else
cout << "索引超出范围!" << endl;
}
终于弄好了 原来是 在编译时Container::iterator 不能认为是一种数据类型 要在前面加上typename才行
谢谢大家
#9
结贴啦 问题解决了