2012-07-16 116 views
0

如何调整包含整数值的矢量的矢量大小。插入并调整矢量的矢量

std::vector<std::vecotr<int>> MyVector; 
int value = 10; 

//need to insert values as 2 rows and 3 columns, like 
//Myvector[0][0] = value; 
//Myvector[0][1] = value; 
//Myvector[0][2] = value; 
//Myvector[1][0] = value; 
//Myvector[1][1] = value; 
//Myvector[1][2] = value; 

// ...... 
//here i have to resize the vector size to 4 rows and 5 cols using resize() function. 

MyVector.resize(.......); //Hoe is this possible. 

第一个问题是,我必须插入值为2行和3列。我如何使用push_back函数来达到这个目的。之后需要调整到指定的大小。由于它是矢量矢量,我正在为此担心。

+0

在我的代码中,数组的大小是恒定的。所有大小都是动态计算的,所以我更喜欢使用矢量而不是动态分配数组,以避免内存泄漏。由于未正确释放动态分配导致内存泄漏。 – 2012-07-16 06:05:02

回答

4

您可以将矢量矢量看作矩阵,其中成员矢量是“行”。

int main() 
{ 
    std::vector<std::vector<int> > MyVector; 
    //Create a row: 
    std::vector<int> subVector; 
    subVector.push_back(1); 
    subVector.push_back(2); 
    //put the row into the vector: 
    MyVector.push_back(subVector); 
    //create another row: 
    subVector.clear(); 
    subVector.push_back(3); 
    subVector.push_back(4); 
    //put the second row into the vector 
    MyVector.push_back(subVector); 
    //access the first row and add an element to it: 
    MyVector[0].push_back(6); 
    //access the second row and add an element to it: 
    MyVector[1].push_back(6); 
} 
2

您可以初始化矢量以包含两个矢量,每个矢量表示一行。这些每一个都可以被初始化为包含三个元素,代表列:

std::vector<std::vecotr<int>> MyVector(2, std::vector<int>(3)); 

那么你可以通过推回新行调整它的大小:

// add a row 
MyVector.push_back(std::vector<int>(3)); 

要添加列,你可以的push_back到每一行,这是更好地与一个辅助功能

void appendColumn(std::vector<int> v); 

实现我认为这将全部得到更好的通过编写一个包装类管理,这样你就可以轻松地确保所有vecto的尺寸rs都与N×M矩阵一致。

0

您可以MyVector一个包装类的的vectorvector左右。您可以定义自己的调整大小操作。在这种情况下,我将其定义为在向量被访问时懒惰地调整列的大小。

struct MyVector { 
    std::vector< std::vector<int> > vec_; 
    size_t cols_; 
    struct MySubVector { 
    const MyVector &outer_; 
    std::vector<int> &vec_; 
    MySubVector (MyVector &outer, std::vector<int> &vec) 
     : outer_(outer), vec_(vec) {} 
    int & operator [] (int i) const { 
     vec_.resize(outer_.cols_); 
     return vec_[i]; 
    } 
    }; 
    MySubVector operator [] (int i) { 
    return MySubVector(*this, vec_[i]); 
    } 
    void resize (size_t rows, size_t cols) { 
    vec_.resize(rows); 
    cols_ = cols; 
    } 
}; 

如果你想在resize对调整大小为您设置一个特定的值,那么你将不得不遍历每个行和调用大小调整操作,并设置初始化。

struct resize_cols { 
    size_t cols; 
    int val; 
    resize_cols (size_t c, int v) : cols(c), val(v) {} 
    void operator() (std::vector<int> &vec) const { 
    vec.resize(cols, val); 
    } 
}; 

void resize (size_t rows, size_t cols, int v) { 
    vec_.resize(rows); 
    std::for_each(vec_.begin(), vec_.end(), resize_cols(cols, v)); 
} 
0

在这种情况下,只需使用resize功能上外载体:

MyVector.resize(2, std::vector<int>(3, value)); 

更一般地,如果你想在不改变现有值来调整, 你必须循环。