结构向量的C++初始化

C++ initialization of vector of structs

本文关键字:初始化 C++ 向量 结构      更新时间:2023-10-16

我正试图在OSX Yosemite下制作一个关键字识别子程序,请参阅下面的列表。我确实有一些奇怪的事情。

我正在使用"操场"来制作MWE,项目构建看起来还可以,但不想运行:"我的Mac运行OS X 10.10.5,这低于String排序的最低部署目标。"我甚至不理解消息,尤其不理解我的代码通过排序产生的结果?

然后,我将相关代码粘贴到我的应用程序中,在该应用程序中使用CMake生成项目,并在相同的配置中使用相同的编译器和IDE显示消息"无法使用初始值设定项列表初始化非聚合类型"矢量在"vector QInstructions={..}"构造中。

在搜索类似的错误消息时,我发现了几个类似的问题,建议的解决方案使用默认构造函数、手动初始化等。我想知道是否可以进行标准的紧凑型初始化?

#include <iostream>
using namespace std;
#include <vector>
enum KeyCode {QNONE=-1,
    QKey1=100, QKey2
};
struct QKeys
{      /** The code command code*/
    std::string    Instr; ///< The command string
    unsigned int    Length; ///< The significant length
    KeyCode Code;  //
};
vector<QKeys> QInstructions={
{"QKey1",6,QKey1},
{"QKey2",5,QKey2}
};
KeyCode FindCode(string Key)
{
    unsigned index = (unsigned int)-1;
    for(unsigned int i=0; i<QInstructions.size(); i++)
        if(strncmp(Key.c_str(),QInstructions[i].Instr.c_str(),QInstructions[i].Length)==0)
        {
            index = i;
            cout << QInstructions[i].Instr << " " <<QInstructions[i].Length << " " << QInstructions[i].Code << endl;
            return QInstructions[i].Code;
            break;
        }
    return QNONE;
}
int main(int argc, const char * argv[]) {
    string Key = "QKey2";
    cout << FindCode(Key);
}

在您的代码中

vector<QKeys> QInstructions={
("QKey1",6,QKey1),
{"QKey2",5,QKey2}
};

第一行数据使用括号"()"。用荣誉"{}"取代它们,它就会起作用。

另外,我看到你已经写了unsigned index = (unsigned int)-1;。根据标准,这是未定义的行为。这也很糟糕,因为您使用的是C样式的强制转换(请参见此处)。您应该将其替换为:

unsigned index = std::numeric_limits<unsigned int>::max();

最后,我找到了正确的解决方案初始化头文件中的可自定义结构向量。遗憾的是,替换圆括号没有帮助。

关于使用-1unsigned int设置为其可能的最高值,我发现在这种情况下使用std::numeric_limits<unsigned int>::max()是一种过度标准化。我个人认为,只要我们使用二的补码表示,赋值就会是正确的。例如,在http://www.cplusplus.com/reference/string/string/npos/你可以阅读:

静态常量size_t npos=-1;

npos是一个具有最大可能值的静态成员常数值size_t类型的元素的值。

该常量的定义值为-1,因为size_t是一个无符号整数类型,它是最大可能的可表示此类型的值。