从一类到另一类直接访问存储在向量中的数据

Posted

技术标签:

【中文标题】从一类到另一类直接访问存储在向量中的数据【英文标题】:getting direct access to data stored in vector from one class to another 【发布时间】:2014-12-04 01:02:27 【问题描述】:

我有一个名为 table 的类,它有一个 vector 作为公共成员,这个 table 类调用一个将数据添加到 vector 中的方法。现在我想从表类访问存储在向量中的这些数据到 NextClass。我尝试使用继承,例如 NextClass:table 工作正常,但实际上 NextClass 不是表类,它是“与表类有关系”,我也尝试将表类的类实例放入 NextClass,但是这样做将不允许我访问向量中的数据,因为它返回一个空向量。请查看我正在尝试实现的抽象代码

表类:

class Table
    
    public:            
        Table();
        vector<vector<float> > vec; //innitializing vector 
        void addTableData(); //method to add data in vector

现在我有另一个类 NextClass

    class NextClass
        public:
            NextClass();    
           vector<vector<float> > nextVector; //new vector to store value from above class
vector<float> innervec;
           void copyVectorToThisClass(); // method to copy vector from table class to this class
           private:
           Table table;  //also tried with making pointer Table *table but no luck

一种将向量数据从表复制到Next类的方法

void NextClass::copyVectorToThisClass()   
 for( int i = 0; i<vec.size();i++)
        for (unsigned int ii=0; ii<table.vec.size();ii++)
            
                innervec.assign(table.vec[i].begin()+ii,table.vec[i].end());
//also tried with vec.pushback
            
            nextVector.push_back(innervec);

编译时没有错误,但是当我尝试检查newVector是否包含任何数据时,它返回空,这意味着新Vector中没有数据传输,如果有办法操纵指针指向里面的数据那么类表就可以很好地完成这段代码..

修改后的代码

表类:

class Table
    
    public:            
        Table();
        void addTableData(); //method to add data in vector
      private:
        vector<vector<float> > vec; //innitializing vector             

现在我有另一个类 NextClass

class NextClass
public:
NextClass();    
vector<vector<float> > nextVector; //new vector to store value from above class
vector<float> innervec;
           void copyVectorToThisClass(); // method to copy vector from table class to this class              
           Table table;  //also tried with making pointer Table *table but no luck    
A method to copy vector data from table to Next class   
void NextClass::copyVectorToThisClass()   
for( int i = 0; i<vec.size();i++)
        for (unsigned int ii=0; ii<table.vec.size();ii++)
            
                innervec.assign(table.vec[i].begin()+ii,table.vec[i].end());
//also tried with vec.pushback
            
            nextVector.push_back(innervec);

非常感谢。

【问题讨论】:

“我尝试使用继承...” 这是个坏主意。当您想对 is a relationship 建模时使用继承。 只是为了提供信息,我试图参考它与继承的关系,但我不希望它是一种关系,这就是我遇到问题的原因 【参考方案1】:

你似乎有一些概念上的错误:

您有一个表作为 nextClass 的成员,那么为什么要将它从表复制到 nextVector?这似乎是重复的数据,而且通常非常糟糕。 您将表中的 vec 属性公开,这通常是个坏主意。

我建议你采用以下结构:

将copyVector改为table,因为vec是table的一部分,最终决定是否复制他的数据。

class table

....
    void getVector( const vector<float>& next ) const


void table::getVector( vector<float>& next ) const

    next = vec; //default = operator

然后,你可以像这样在 NextClass 中使用它:

void NextClass::copyVectorToThisClass( const table& t)
 
    t.getVector( nextVector );

(好吧,代码是“即时”编写的,可能有错字)

【讨论】:

但是向量是多维的, 像复制构造函数一样的 = 操作符是进行深度复制,而不是影子复制,所以根据需要有任何级别是没有问题的。 我应该这样做,void getVector( const vector>& next ) const,抱歉我现在才学习 是的,你可以像这样复制整个向量。我不太确定你在双 for 循环中做了什么,所以我不能说它是否相同(可能不是)。 我试过这样做:void Table::getVector( const vector&lt;vector&lt;float&gt;&gt;&amp; next ) const next = vec; 但收到此错误消息错误:将 'const std::vector<:vector> >' 作为 'std:: 的 'this' 参数传递vector<_tp _alloc>& std::vector<_tp _alloc>::operator=(const std::vector<_tp _alloc>&) [with _Tp = std::vector; _Alloc = std::allocator<:vector> >]' 丢弃限定符 [-fpermissive] 进程以状态 1 终止(0 分钟,0 秒)【参考方案2】:

您在函数的开头初始化向量,然后运行 ​​for 循环到 vec.size() 为 0,因为向量中没有任何内容。

【讨论】:

那么,我该如何做到这一点,老实说,我尽我所能,只是无法解决......任何建议都会非常明显 运行你的 for 循环不是 vec 的大小,而是你要复制的向量的大小,然后将你正在处理的向量的每个值 push_back 到你在新类中初始化的向量中 对不起,上面的代码有错误,我已经修改了,vec是类表的成员... 我仍然对你为什么要运行一个空向量大小的 for 循环感到困惑 如何从类表中获取向量的大小【参考方案3】:
    在类 NextClass 的构造函数中创建类 Table 的实例 使用类表对象调用函数addTableData()从文件中取数据 然后调用函数copyVectorToThisClass()

【讨论】:

【参考方案4】:
struct Table 
  vector<vector<float> > vec;
  vector<vector<float> > & getDataRef()  return vec; 
;

class NextClass 
  vector<vector<float> > nextClassVec;
  public NextClass(Table t) 
    nextClassVec = t.getDataRef(); // method #1, maybe?
  

  public readTable (const struct Table& tbl)  // method 2 ..?
    const vector<vector<float>> &tblVecRow = tbl.vec;
    for(int i = 0; i < tblVecRow.size();++i) 
      const vector<float> & tblVecData = tblVecRow[i];
      vector<float> nextClassVecData;
      for(int j = 0; j < tblVecData.size(); ++j) 
        nextClassVecData.push_back(tblVecData[j]);
      
      nextClassVec.push_back(nextClassVecData);
    
  
;

这对矢量数据进行了深层复制(至少这是我的想法——我还没有编译过这个)。 [非常] 可能有比这更好的解决方案(例如使用 copy() 算法);如果是这样,欢迎大家改进它。

其他说明:

真的不必是这么麻烦的IMO。但我在反抗 想改进你的问题 您当前形式的 vec.assign 在项目上重复运行 已经处理了。我认为它只是用伪代码表示你 想要复制元素

【讨论】:

以上是关于从一类到另一类直接访问存储在向量中的数据的主要内容,如果未能解决你的问题,请参考以下文章

具有分类数据的一类支持向量机

从另一类 Windows 手机访问页面的按钮控件?

喜欢 libsvm 中的一类(python)

从0到1详解推荐系统中的嵌入方法,原理算法到应用都讲明白了

HDFS总结

迭代器