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