【问题标题】:vector< pair<aStruct*,int> > not possible?向量< pair<aStruct*,int>> 不可能?
【发布时间】:2011-07-06 07:01:12
【问题描述】:

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

假设我有以下结构:

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 的类型/值不匹配

这是不可能的事情吗? 有什么可以替代的解决方案? 非常感谢您的意见!

【问题讨论】:

  • 你必须阅读一些c++教程。
  • 尽量不要在容器中存储裸指针。这种方式很难进行正确的内存管理。
  • 在创建pair以将其添加到向量中时,您应该返回模板参数,例如这对(nod1,3) 通常,您对其进行typedef跨度>
  • 除了您询问的问题以及答案中提出的所有其他(与指针相关的)问题,您的构造函数应该采用const string&amp; 而不是可变字符串。 (在一般情况下,这将保存一个副本,更重要的是它更正确、更健壮且更容易推理)

标签: c++ vector struct std-pair


【解决方案1】:

创建新对时,请改用make_pair

所以这行得通:nodevector.push_back(make_pair(nod1, 3));

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      请尝试:

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

      或者更好:

      nodevector.push_back(make_pair(nod1,3));
      

      【讨论】:

        【解决方案4】:

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

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

        你正在做类似的事情

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

        显然,你想要

        v.push_back(i);
        

        希望对您有所帮助。

        【讨论】:

          【解决方案5】:

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

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

          改正它。

          【讨论】:

            【解决方案6】:

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

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

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

            【讨论】:

              【解决方案7】:

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

              nodevector.emplace_back(nod1, 3);
              

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

              nodevector.push_back(std::pair{nod1, 3});
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-02-20
                • 2014-07-14
                • 2020-08-03
                • 2020-10-22
                • 2020-12-17
                • 1970-01-01
                相关资源
                最近更新 更多