Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符数组集(固定大小)和相等重载_C++_Arrays_Char_Set - Fatal编程技术网

C++ 字符数组集(固定大小)和相等重载

C++ 字符数组集(固定大小)和相等重载,c++,arrays,char,set,C++,Arrays,Char,Set,所以我想使用一组char[4],这样我就可以在其中存储这样的数组,并检查元素是否已经在其中。我今天开始用C++,所以我肯定不是专家。以下是我目前所做的: struct Comparator { bool operator()(unsigned char* s1, unsigned char* s2) const { for (int i = 0; i < 4; ++i) { if (s1[i] != s2[i]) {

所以我想使用一组char[4],这样我就可以在其中存储这样的数组,并检查元素是否已经在其中。我今天开始用C++,所以我肯定不是专家。以下是我目前所做的:

struct Comparator {
    bool operator()(unsigned char* s1, unsigned char* s2) const {
        for (int i = 0; i < 4; ++i) {
            if (s1[i] != s2[i]) {
                return s1[i] < s2[i];
            }
        }
        return false;
    }
};

int main(int argc, const char* argv[]) {
    set<unsigned char*, Comparator> setValues;
    unsigned char *v1 = (unsigned char*) malloc(4);
    unsigned char *v2 = (unsigned char*) malloc(4);
    v1[0] = 'a';
    v1[1] = 'b';
    v1[2] = 'c';
    v1[3] = 'd';

    v1[0] = 'a';
    v1[1] = 'b';
    v1[2] = 'c';
    v1[3] = 'd';

    setValues.insert(v2);

    printf("%lu\n", setValues.count(v1));
    free(v1);
    free(v2);
    return EXIT_SUCCESS;
}
结构比较器{ 布尔运算符()(无符号字符*s1,无符号字符*s2)常量{ 对于(int i=0;i<4;++i){ if(s1[i]!=s2[i]){ 返回s1[i] 不幸的是,这个程序的输出是“0”。考虑到v1和v2之间的字符是相同的,我希望输出是“1”(我插入了v2并试图找到v1)

如何使集合比较数组的值(而不是指针)?我搜索并尝试重载运算符“==”,但没有成功,人们似乎说重载“()”就足够了

另一件事:我也真的对集合分配不满意。我知道在我的程序执行结束时,我的集合中会有100个数组,所以我想知道是否有办法直接为集合分配100*char[4]


多谢各位

您的示例中有一个错误。v2从未初始化。v1设置两次。因此,您正在将垃圾值放入集合中malloc而是
new
,即使你坚持使用malloc。第二个建议是,简单地使用
std::string
来存储字符。像您这样的任务根本不需要手动分配。让标准容器为您做这件事。撇开样式点和良好实践不谈,以下是您需要知道的,以了解发生了什么:首先,您需要更改比较器,如中所示。接下来,您将两次初始化
v1
,并且从不初始化
v2
;看一下你作业的左边a、b、c、d。因为您曾经初始化过
v2
,所以您只是在插入带有随机垃圾内存的数组,当您搜索
v1
时,您插入的
v2
的垃圾值当然不会被找到。改变这两件事,你的程序就会像你期望的那样运行。实际上,我不能将我所有的char[4]转换成str(char[5]),因为我必须尽可能优化我的代码。。感谢您关于malloc&cie:)关于分配的建议:查看第三个模板参数以设置
。您可以创建自己的STL
allocator
对象,将其传递到此处以处理分配。这是一个有点高级的主题,但是如果你想能够使用一个集合预先分配100个元素,这就是你要做的;也就是说,当
集合
在内部请求内存时,预分配将发生在
分配器
对象内,并传递给
集合
。回答如下:演示如何使用Boost实现这一点(Boost有一个可以使用的
分配器
对象)。您今天开始使用C++,您已经担心优化问题,因为数组中有1个额外字符?如果你问我,那就没道理了。