CStrings初始化和用法传染媒介传染媒介

时间:2013-02-06 19:47:18

标签: c++ arrays c-strings libharu

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

以下是我尝试初始化Vector>

的方法
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!
        }
    }

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

3 个答案:

答案 0 :(得分: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";

答案 1 :(得分:1)

如果您尚未将任何内容推送到向量中或使用大小和填充(see vector's constructor)对其进行初始化,则无法通过std::vector初始化具有索引访问权限的[]条目。因此,当tableData为空且oTA.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");
    }
}

答案 2 :(得分:0)

如果不先添加项目,就不能简单地访问std :: vector。使用std :: vector :: push_back()或使用构造函数Cplusplus.com