1

所以我尝试制作一个向量,其中元素是结构指针和整数对,我开始认为这可能是不可能的..

假设我有以下结构:

struct node{
  string str;
  int size;
  node *child[3];
  node(string str1):str(str1){ size = 0;}
};

和一个向量:

vector< pair<node*,int> > nodvector;

然后我尝试创建一个新节点并将其放入向量中,显然它不起作用:

int main(){
   node* nod1 = new node("HELLO");
   node* nod2 = new node("WORLD");
   nodevector.push_back(pair<nod1,3>);
   delete nod1;
   delete nod2;
}

编译器对我咆哮说:nod1 不能出现在常量表达式中错误:模板参数 1 无效错误:模板结构 std::pair 的模板参数列表中参数 2 的类型/值不匹配

这只是不可能的事情吗?有什么可以替代的解决方案?您的意见将不胜感激!

4

7 回答 7

8

当您创建新对时,请make_pair改用。

所以这有效:nodevector.push_back(make_pair(nod1, 3));

于 2011-07-06T07:05:23.097 回答
3

nodevector.push_back(pair<node*,int>(nod1, 3));

于 2011-07-06T07:04:57.707 回答
1

问题是您正在使用nod1and3作为模板参数来配对:

nodevector.push_back(pair<nod1,3>);

相反,请尝试:

nodevector.push_back(pair<node, int>(nod1,3));

或者更好:

nodevector.push_back(make_pair(nod1,3));
于 2011-07-06T07:06:03.410 回答
1

以上所有答案都是正确的。

您的代码正在尝试将“类型”推送到向量中。这就是编译器生气的原因:)。

你正在做类似的事情

int i = 10;
vector<int> v;
v.push_back(int);

显然,你想要

v.push_back(i);

希望有帮助。

于 2011-07-06T07:14:01.153 回答
0

创建一个配对对象。你还没有创建它。

你认为“对”是正确的语法吗?

纠正它。

于 2011-07-06T07:07:25.007 回答
0

尝试这样的事情,您会混淆要操作的应计类的模板参数。

vector< pair<node*,int> > nodvector;

节点* nod1 = 新节点(“你好”);节点* nod2 = 新节点(“世界”);nodvector.push_back(对(nod1,4)); 删除节点1;删除点头2;}

于 2011-07-06T07:09:50.470 回答
0

从 C++11 开始,一个更简洁的替代方案nodevector.push_back(pair<node*,int>(nod1, 3));甚至nodevector.push_back(make_pair(nod1, 3));是使用emplace_back. std::vector<T>::emplace_back将采用与构造函数相同T的参数,因此您可以直接输入参数:

nodevector.emplace_back(nod1, 3);

如果您仍然觉得需要使用push_back,则可以推导出 C++17 类模板参数,因此您不必使用make_pair

nodevector.push_back(std::pair{nod1, 3});
于 2021-08-17T18:39:20.683 回答