Вектор векторов инициализации и использования CStrings

Я пытаюсь создать Вектор Векторов 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!
}
}

Но я думаю, что я не инициализирую это должным образом. Я продолжаю получать ошибку вектора вне границ.

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";
2

Другие решения

Вы не можете инициализировать std::vector записи с индексированным доступом через [] если вы еще ничего не вставили в вектор или не инициализировали его с размером и заполнением (увидеть vectorконструктор). Так что это вызовет проблемы, когда tableData пусто и oTA.rows или же oTA.cols являются 0,

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");
}
}
1

Вы не можете просто получить доступ к std :: vector без предварительного добавления элементов. Либо используйте std :: vector :: push_back (), либо используйте конструктор Cplusplus.com

0