push_back 2D std::vector< std::vector<char*> > 值,所有值都相同

push_back on 2D std::vector< std::vector<char*> > value made all the values are the same

本文关键字:gt vector lt std back push char 2D      更新时间:2023-10-16

如何在 2D 矢量中添加值 std::vector<std::vector><char*>>

我正在使用此代码,但兽医内部的项目结果是相同的。而来自数据库查询的数据是多种多样的。

std::vector< std::vector<char*> >  results;
char *dataTemp = new char[128];
sqlite3_stmt *statement;
int rc = sqlite3_prepare_v2(m_pDbFile, sql, -1, &statement, 0);
if( rc == SQLITE_OK )
{
    int cols = sqlite3_column_count(statement);
    int result = 0;
    int count = 0;
    while(true)
    {
        result = sqlite3_step(statement);
        if(result == SQLITE_ROW)
        {
            std::vector<char*, std::allocator<char*>> values;
            for(int col = 0; col < cols; col++)
            {
                char* value = (char*)sqlite3_column_text(statement, col);
                values.push_back((char*)sqlite3_column_text(statement, col));
            }
            results.push_back(values);
        }
        else
        {
            break;  
        }
        count++;
    }
    
    sqlite3_finalize(statement);
}

问题
sqlite3_column_text返回的指针(C 类型字符串)在后续调用 sql API 后可能会失效/重用。因此,您应该保留内容,而不是保存指针本身。

溶液
在代码中进行以下 3 项更改。

#include <string>  // 1
...
std::vector< std::vector<std::string> >  results;  // 2
...
            std::vector<std::string> values;  // 3
            for(int col = 0; col < cols; col++)
            {
                const char* value = (char*)sqlite3_column_text(statement, col);  // Optional
                values.push_back(value);  // Optional
            }
...