2

CStrings のベクトルのベクトルを作成しようとしています。CStrings の 2 次元配列。これは、テーブル内のデータを表します。(もちろん、すべてのデータは 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!
        }
    }

しかし、私はそれを正しく初期化していないと思います。ベクトル範囲外エラーが発生し続けます。

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 に答える