在类构造函数中设置 std::vector
Setup std::vector in class constructor
我正在设计一个将std::vector<int>
作为实例变量的类。 我正在使用std::vector
,因为我需要在运行时设置它的大小。 以下是我的代码的相关部分:
my_class.h:
#include <vector>
using std::vector;
class MyClass {
int size;
vector<int> vec;
}
my_class.cc:
#include "my_class.h"
using std::vector
MyClass::MyClass(int m_size) : size(m_size) {
vec = new vector<int>(size,0);
}
当我尝试编译时,我收到以下错误消息:
g++ -c -Wall my_class.cc -o my_class.o
my_class.cc: In constructor ‘MyClass::MyClass(int):
my_class.cc:4 error: no match for ‘operator=’ in ‘((MyClass*)this)->My_Class::vec = ((*(const allocator_type*)(& std::allocator<int>())), (operator new(24u), (<statement>, ((std::vector<int>*)<anonymous>))))’
make: *** [my_class.o] Error 1
但是,当我将违规行更改为:
vector<int> temp(size,0);
vec = temp;
它现在可以顺利编译,我得到了所需的行为,并且可以访问我的向量
vec[i] // i having been defined as an int yada yada yada
这种解决方法是可以的,但我想了解为什么它有效并且第一种方法失败。
只需执行以下操作:
MyClass::MyClass(int m_size) : size(m_size), vec(m_size, 0)
您似乎已经了解初始值设定项列表,为什么不直接在那里初始化向量?
vec = new vector<int>(size,0);
是非法的,因为new
返回一个指针,在您的情况下vec
是一个对象。
您的第二个选择:
vector<int> temp(size,0);
vec = temp;
虽然它可以编译,但做额外的工作没有任何收获。当你到达任务时,两个向量已经被构造并随后丢弃。
向量的使用在你的类中是合法的,问题是你如何初始化它:
#include <vector>
class MyClass {
public:
MyClass(int m_size);
// ... more things...
private:
int size;
vector<int> vec;
}
您正在分配指向新矢量对象的指针,就好像此矢量对象未初始化一样。
vec = new vector<int>(size,0);
如果你真的希望它工作,那么你应该将你的vec
对象声明为:
vector<int> * vec;
并且不要忘记添加一个析构函数:
MyClass::~MyClass {
delete vec;
}
为什么当你放下new
粒子时它会起作用?因为您正在创建一个新对象vector
并覆盖类中的对象(但是,这并不能保证正确消除原始对象(。
你实际上不需要这样做。当您到达 MyClass 的构造函数时,您的vector
对象已经初始化(调用其默认构造函数(。如果只想确保为size
项保留内存:
MyClass::MyClass(int m_size): size(m_size) {
vec.reserve( size );
}
如果您希望向量具有size
元素,则:
MyClass::MyClass(int m_size): size(m_size), vec(m_size, 0)
{}
最后,正如一位评论者指出的那样,一旦构建了向量,实际上就不需要大小了。所以你可以摆脱size
成员:
class MyClass {
public:
MyClass(int m_size): vec(m_size, 0)
{}
unsigned int getSize() const
{ return vec.size(); }
// ... more things...
private:
vector<int> vec;
}
希望这有帮助。
#include <vector>
#include <iostream>
#include <string>
#include <typeinfo>
using std::cout;
using std::endl;
using std::string;
using std::vector;
using std::to_string;
class Parse
{
private:
string m_str;
vector<string> m_vec;
public:
// Constructor with all defaults (1 of 4 constructors)
Parse(){
cout << "ncreating class with all default valuesn";
m_str = "";
m_vec.push_back("");
}
// Constructor with all cases used
Parse (string &tmp_str,
vector<string> tmp_vec):
m_str (tmp_str),
m_vec (tmp_vec)
{
cout << "Your vector contains " + to_string(m_str.size()) + " argumentsn";
}
// Constructor with other contents given but not vector
Parse (string &tmp_str):
m_str (tmp_str)
{
m_vec.push_back("");
}
// Constructor with only Vector given but not other contents
Parse (vector<string> tmp_vec):
m_vec (tmp_vec)
{
m_str = "";
}
string get_str_var(){return m_str;}
void classed_print_vector_strings()
{
for (string i : m_vec){ cout << i << " n";}
}
};
// rm ./class_vector; g++ class_vector.cpp -o class_vector -std=c++17; ./class_vector arg1 arg2 arg3
int main(int argc, char *argv[])
{
// turn **argv to a vector
vector<string> args(argv, argv + argc);
// iterate from argv through argv+argc
// initialize with default arguments.
Parse tracker1;
// initalize with all used arguments
Parse tracker2(args[0], args);
// initalize with only the vector
Parse tracker3(args);
// initalzie without the vector, but with another arg
Parse tracker4(args[0]);
cout << "nTracker 1 ---------------------n";
tracker1.classed_print_vector_strings();
cout << "nTracker 2 ---------------------n";
tracker2.classed_print_vector_strings();
cout << "nTracker 3 ---------------------n";
tracker3.classed_print_vector_strings();
cout << "nTracker 4 ---------------------n";
tracker4.classed_print_vector_strings();
return 0;
}
rm ./class_vector; g++ class_vector.cpp -o class_vector -std=c++17; ./class_vector arg1 arg2 arg3
这将向您展示如何创建一个类,该类将给出您可以选择在有或没有的情况下初始化类存在和/或不存在其他参数的向量。
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?