使用用户定义的 class 和 int 创建向量 在“struct std::_Vector_base] 的实例化中......在“class MyClass”中没有名为“value_type”的类型

creating a vector with user defined class and int In instantiation of ‘struct std::_Vector_base....no type named ‘value_type’ in ‘class MyClass’

我正在创建一个简单的 class

#include <iostream>
#include <vector>
#include <algorithm>    

using namespace std;

class MyClass {
    int p;

public:
    MyClass( int q ) { p = q; }
};

但是当我尝试创建这个向量时

 vector<int, MyClass> vec1(1);

我的代码中断并抛出这个异常

vector<int,MyClass> vec1(1);

In instantiation of ‘struct std::_Vector_base<int, MyClass>’:
/usr/include/c++/9/bits/stl_vector.h:386:11:   required from ‘class std::vector<int, MyClass>’
vector_class.cpp:19:26:   required from here
/usr/include/c++/9/bits/stl_vector.h:84:21: error: no type named ‘value_type’ in ‘class MyClass’
   84 |  rebind<_Tp>::other _Tp_alloc_type;

我可以解决这个问题吗?我可以像这样在 vector 中使用 int 类型和用户定义类型 vector<int,MyClass>

vector 有两个模板参数。

  • 第一个是要存储到向量中的元素类型。
  • 第二个是分配器,一个帮助器 class 分配和释放向量使用的内存。

您正在尝试创建一个使用 MyClass 作为分配器的向量。但是,MyClass 不提供 vector 期望的调用,因此编译失败。

你想要完成什么?

如果你想要一个包含 MyClass 对象的向量,那么你应该声明一个 vector<MyClass>。如果你想要一个包含对象对的向量,一个 int 和一个 MyClass 那么你可以使用 vector<pair<int, MyClass> (正如其他评论者提到的那样)。

但是从你的问题中并不清楚你真正想要的是什么。

how to print p if I am using pair in vector as u shown

您可以遍历向量的元素对并打印数据成员p,如下所示:

class MyClass {
    public:
    int p;

public:
    MyClass( int q ):p(q)
    {
        
    }
};

int main()
{
    std::vector<std::pair<int, MyClass>> vec1{{1, MyClass(44)}, {2,MyClass(45)}, {3,MyClass(46)}};
    
    //iterate through the vector and print data member p
    for(const auto&myPair: vec1)
    {
//-----------------vvvvvvvvvvvvvv-------------->print the data member p 
        std::cout<<myPair.second.p<<std::endl;
    }
}

Working demo