2

我正在尝试创建 CStrings 向量的向量;CStrings 的二维数组。这将表示表格中的数据。(当然,所有数据都是 CString)。

这是我尝试初始化向量的方法>

std::vector<std::vector<CString>> tableData;
    for(int r = 0; r < oTA.rows; r++)
        for(int c = 0; c < oTA.cols; c++)
            tableData[r][c] = "Test";

这是我尝试使用它的方式

for(int r = 0; r < tabAtt.rows; r++)
    {
        // TextYpos = bottom of table + 5(padding) + (row height * row we're on)
        HPDF_REAL textYpos = tabAtt.tabY + 5 + (r*tabAtt.rowH);
        for(int c = 0; c < tabAtt.cols; c++)
        {
            // TextXpos = left of table + 5(padding) + (col width * col we're on)
            HPDF_REAL textXpos = tabAtt.tabX + 5 + c*tabAtt.colW;
            HPDF_Page_TextOut (page, textXpos, textYpos, (CT2A)tableData[r][c]); // HERE!
        }
    }

但我认为我没有正确初始化它。我不断得到一个向量超出范围的错误。

4

3 回答 3

2

这是因为您需要在访问矢量元素之前分配内存并构造它们。这应该有效:

std::vector<std::vector<CString>> tableData;
for(int r = 0; r < oTA.rows; r++)
{
    tableData.push_back(std::vector<CString>());
    for(int c = 0; c < oTA.cols; c++)
       tableData.back().push_back("Test");
}

或者,稍微更有效:

std::vector<std::vector<CString>> tableData(oTA.rows,std::vector<CString>(oTA.cols));
for(int r = 0; r < oTA.rows; r++)
    for(int c = 0; c < oTA.cols; c++)
       tableData[r][c]="Test";
于 2013-02-06T19:52:56.067 回答
1

如果您尚未将任何内容推入向量或使用大小和填充(请参阅的构造函数std::vector)对其进行初始化,则无法通过索引访问初始化条目。因此,当为空和或为时,这将导致问题。[]vectortableDataoTA.rowsoTA.cols0

for(int r = 0; r < oTA.rows; r++)
    for(int c = 0; c < oTA.cols; c++)
        tableData[r][c] = "Test";

您应该使用vector::push_back()添加数据:

for(int r = 0; r < oTA.rows; r++) {
    tableData.push_back(std::vector<CString>());
    for(int c = 0; c < oTA.cols; c++) {
        tableData.back().push_back("Test");
    }
}
于 2013-02-06T19:54:47.760 回答
0

如果不先添加项目,您将无法简单地访问 std::vector。要么使用 std::vector::push_back() 要么使用构造函数Cplusplus.com

于 2013-02-06T19:57:41.200 回答