天道酬勤,学无止境

C++中的json比较(json Comparison in c++)

问题

我有点卡在这里,有人可以帮忙吗?

#include <iostream>
#include "include/rapidjson/document.h"
#include "include/rapidjson/writer.h"
#include "include/rapidjson/prettywriter.h"
//#include "include/rapidjson/stringbuffer.h"
using namespace std;
using namespace rapidjson;

class test {
 public:
static bool isEqual(const string &item1, const string &item2, const string &temp) {
    Document d1;
    d1.Parse(item1.c_str());
    Document d2;
    d2.Parse(item2.c_str());
    Document d3;
    d3.Parse(temp.c_str());
    bool a = true;
    bool b = isJsonEqual(d1, d2, d3, a);

}

static bool isJsonEqual(Value &v, Value &v1, Value &v2, bool &a) {
/*
    StringBuffer buffer;


    PrettyWriter<StringBuffer> writer(buffer);


    v.Accept(writer);
    //cout<<buffer.GetString()<<endl;
    StringBuffer b1;
    PrettyWriter<StringBuffer> writer1(b1);
    v1.Accept(writer1);
    //cout<<b1.GetString()<<endl;
    StringBuffer b2;
    PrettyWriter<StringBuffer> writer2(b2);
    v2.Accept(writer2);
     //cout<<b2.GetString()<<endl;
  */

    for (auto itr = v2.MemberBegin(); itr != v2.MemberEnd(); itr++) {
        if (itr->value.IsArray()) {
           StringBuffer b3;
            PrettyWriter<StringBuffer> writer3(b3);
            v2[itr->name].Accept(writer3);
            cout << b3.GetString() << endl;
            auto c = itr->name.GetString();

            cout << c << endl;

     //isJsonEqual(v[itr->name],v1[itr->name],v2[itr->name],a);
        } else if (v.HasMember(itr->name) && v1.HasMember(itr->name)) {
            // cout<<itr->name.GetString()<<endl;
            if ((v[itr->name]) != v1[itr->name]) {


                a = false;
                break;
            }
        }
    }

}


};

 int main() {
  const char *input1 = "{  \"array\": [    1,    2,    3  ],  
 \"boolean\": true,  \"null\": null,  \"number\": 123,  \"object\": {    
 \"a\": \"b\",    \"c\": \"d\",    \"e\": \"f\"  },  \"string\": 
 \"Hello World\",   \"object_array\": [     {\"key\": \"value1\" },     
 {\"key\": \"value2\" },     {\"key\": \"value3\" }    ],    
 \"deep_nested_array\": [        {\"object_array1\": [     {\"key\": 
 \"value1\" },     {\"key\": \"value2\" },     {\"key\": \"value3\" }    
 ]},    {\"object_array2\": [     {\"key\": \"value4\" },     
 {\"key\": \"value5\" },     {\"key\": \"value6\" }    ]}      ]}";

const char *input2= "{ \"array\": [    1,    2,    3  ],   
\"justsomedata\": true,  \"boolean\": true,  \"null\": null,  
\"object\": {    \"a\": \"b\",    \"c\": \"d\",    \"e\": \"f\"  },  
\"number\": 123,  \"object_array\": [     {\"whatever\": \"test\", 
 \"key\": \"value1\" },     {\"key\": \"value2\" },     {\"key\": 
 \"value3\" }    ],    \"deep_nested_array\": [        
 {\"object_array1\": [     {\"key\": \"value1\" },     {\"key\": 
 \"value2\" },     {\"key\": \"value3\" }    ]},    
 {\"object_array2\": [     {\"key\": \"value4\" },     {\"key\": 
 \"value5\" },     {\"key\": \"value6\", \"ignoreme\": 12346 }    ]}      
  ],  \"string\": \"Hello World\"}";
  const char *temp = "{  \"array\": [    null  ],  \"boolean\": null,  
 \"null\": null,  \"object\": {    \"a\": null,    \"c\": null,    
 \"e\": null  },  \"number\": null,  \"object_array\": [     {\"key\": 
 null }    ],    \"deep_nested_array\": [        {\"object_array1\": [     
 {\"key\": null },     {\"key\": null },     {\"key\": null }    ]}      
 ],  \"string\": null}";

bool a = test::isEqual(input1, input2, temp);
if (a) {
    cout << "True";
    //std::cout << "Verify again" << std::endl;
} else {
    cout << "check again";
}
       }

//isJsonEqual(v[itr->name],v1[itr->name],v2[itr->name],a); 问题出在这里后找到关键是一个数组我想使用递归深入嵌套数组并在其中迭代(即在我遇到它之后我想递归整个数组作为解析的json来循环内部并进行比较每个键。或者我们可以为现有json中的数组创建一个新的json并递归检查它的值吗?请对此有一些想法。

回答1

据我了解,代码应该是这样的:

bool isJsonEqual(const Json::Value &reference, Json::Value &v1, Json::Value &v2)
{
    switch (reference.GetType()) {
        case Json::Value::booleanValue: {
             if (reference.asBool()) {
                 return v1 == v2;
             } else {
                 return true; // don't check comparison
             }
        }
        case Json::Value::nullValue : return true; // don't check comparison
        case Json::Value::arrayValue: {
            if (v1.GetType() != Json::Value::arrayValue
             || v2.GetType() != Json::Value::arrayValue) {
                 return false;
            }
            const auto size = reference.ArraySize();
            if (v1.ArraySize() != size || v2.ArraySize() != size) {
                 return false;
            }
            // Recurse on array
            for (std::size_t i = 0; i != size; ++i) {
                 if (!isJsonEqual(reference[i], v1[i], v2[i])) {
                     return false;
                 }
            }
            return true;
        }
        case Json::Value::objectValue: {
            if (v1.GetType() != Json::Value::objectValue
             || v2.GetType() != Json::Value::objectValue) {
                 return false;
            }
            // Recurse on members
            for (const auto& member : reference.getMemberNames()) {
                 if (!isJsonEqual(reference[member], v1[member], v2[member])) {
                     return false;
                 }
            }
            return true;
        }
        default: {
            throw std::runtime_error("Invalid reference");
        }
    }
}
标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • MATLAB 中的 fft2 与 OpenCV C++ 中的 dft 速度比较(fft2 in MATLAB vs dft in OpenCV C++ speed comparison)
    问题 我想知道为什么 OpenCVC++ 中的dft函数比二维矩阵的fft2慢很多。 以下 C++ 代码来自文档: void fft2(const Mat in, Mat &complexI) { Mat padded; int m = getOptimalDFTSize(in.rows); int n = getOptimalDFTSize(in.cols); copyMakeBorder(in, padded, 0, m - in.rows, 0, n - in.cols, BORDER_CONSTANT, Scalar::all(0)); Mat planes[] = {Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F)}; merge(planes, 2, complexI); dft(complexI, complexI); } int main(){ Mat a(5000, 5000, CV_32F); randn(a, 0, 1); Mat res; clock_t start = clock(); fft2(a,res); cout << clock() - start; } MATLAB代码: mat1 = rand(5000,5000); tic, a = fft2(mat1); toc
  • 此代码中的 Matlab 与 C++ 速度比较(Matlab vs c++ speed comparison in this code)
    问题 我编写了简单的 C++ 代码并在 C++ 中对其进行了测试,然后我通过mex file_name.cpp为 MATLAB 改编了相同的代码,并在使用与 C++ 相同的编译器的 MATLAB 中运行了相同的代码。 这是代码: int k; for(int j = 0; j < 100;j++){ for(int i = 0; i < 10000000; i++){ k++; } k/=10000000 } 这是MATLAB代码: double a;int j;int i; double* k; for(j = 0; j < 100;j++){ for(i = 0; i < 10000000; i++){ a = a+1; } a = a / 10000000; } plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); k = mxGetPr(plhs[0]); *k = (double)a; 我已经为 MATLAB 编辑了这段代码,即更改为合适的类型、添加 MEX 函数等,结果在 MATLAB 中大约为 900 毫秒,而在 C++ 中为 3100 毫秒。 我不明白的是,两者都运行相同的代码并使用相同的编译器(在 MATLAB 中,我在命令行中编写mex -setup并选择 Visual Studio 编译器作为 MEX 编译器),但是
  • C ++最快的JSON读写器(Fastest JSON reader/writer for C++ [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 我需要一个C ++ JSON解析器和编写器。 速度和可靠性非常关键,我不在乎接口是否良好,是否基于Boost,甚至C解析器都很好(如果它比C ++更快)。 如果有人对可用JSON解析器的速度有经验,请告知。 回答1 http://lloyd.github.com/yajl/ http://www.digip.org/jansson/ 真的不知道他们如何比较速度,但是第一个看起来像是扩展到真正的JSON数据的正确想法,因为它一次只解析一小块数据,因此他们不需要将所有数据都保存在其中。一次存储(根据库/用例的不同,可以更快或更慢) 回答2 Rapidjson是一种C ++ JSON解析器/生成器,旨在实现快速且较小的内存占用。 与YAJL和JsonCPP有性能比较。 更新: 我创建了一个开源项目本机JSON基准,该标准在一致性和性能方面评估了29个(并且还在不断增加)的C / C ++ JSON库。 这应该是一个有用的参考。 回答3 https://github.com/quartzjer/js0n 界面可能最笨拙,但您要做什么。 零分配。 http://zserge.com/jsmn.html另一种零分配方法。
  • json Comparison in c++
    I am a little stuck here can anyone help please. #include <iostream> #include "include/rapidjson/document.h" #include "include/rapidjson/writer.h" #include "include/rapidjson/prettywriter.h" //#include "include/rapidjson/stringbuffer.h" using namespace std; using namespace rapidjson; class test { public: static bool isEqual(const string &item1, const string &item2, const string &temp) { Document d1; d1.Parse(item1.c_str()); Document d2; d2.Parse(item2.c_str()); Document d3; d3.Parse(temp.c_str()); bool a = true; bool b = isJsonEqual(d1, d2, d3, a); } static bool isJsonEqual(Value &v, Value &v1
  • C ++编译错误:ISO C ++禁止比较指针和整数(c++ compile error: ISO C++ forbids comparison between pointer and integer)
    问题 我正在尝试Bjarne Stroustrup的C ++书(第三版)中的示例。 在实现一个相当简单的功能时,出现以下编译时错误: error: ISO C++ forbids comparison between pointer and integer 是什么原因造成的? 这是代码。 错误在if行中: #include <iostream> #include <string> using namespace std; bool accept() { cout << "Do you want to proceed (y or n)?\n"; char answer; cin >> answer; if (answer == "y") return true; return false; } 谢谢! 回答1 您有两种方法可以解决此问题。 首选方法是使用: string answer; (而不是char )。 解决该问题的另一种方法是: if (answer == 'y') ... (请注意,单引号而不是双引号表示一个char常量)。 回答2 字符串文字用引号分隔,并且类型为char *而不是char。 示例: "hello" 因此,当将char与char *进行比较时,您将得到相同的编译错误。 char c = 'c'; char *p = "hello"; if(c==p)/
  • 在 C++ 代码中将 size_t 变量与 -1(最大大小值)进行比较(Comparison size_t variable with -1 (maximum size value) in c++ code)
    问题 我正在重构一个库并试图摆脱许多 gcc 警告。 这些警告的很大一部分是关于有符号/无符号比较,并且与size_t的使用有关。 该库适用于 64 位 Linux 系统。 程序员使用 -1 作为类似于std::string::npos的特殊值。 库中有很多地方的代码是这样的: class AnnotationBase { public: size_t m_offset = -1; size_t m_length = -1; } ... AnnotationBase foo(const std::string& text, const AnnotationBase& annot) { AnnotationBase newAnnot; // do some job with annotations and text ... if(newAnnot.m_offset == -1) { // do some other job ... } return newAnnot; } 问题在于 gcc 由于有符号/无符号比较而在if(newAnnot.m_offset == -1)行上生成的警告: "warning: comparison between signed and unsigned integer expressions [-Wsign-compare]" 在没有警告的情况下将 C+
  • C++ 命名空间,与 Java 包的比较(C++ Namespaces, comparison to Java packages)
    问题 我最近完成了一堆 Java 编码,并且已经习惯了非常具体的包命名系统,具有深层嵌套,例如com.company.project.db 。 这在 Java、AS3/Flex 和 C# 中运行良好。 我也看到了在 C++ 中应用的相同范例,但我也听说将 C++ 命名空间视为 Java 包的直接对应物是不好的。 这是真的吗,为什么? 命名空间/包有何相似和不同之处? 如果使用深层嵌套命名空间,可能会出现哪些问题? 回答1 在 C++ 中,命名空间只是对可用名称进行分区。 Java 包是关于模块的。 命名层次结构只是其中的一个方面。 C++ 中深度嵌套的命名空间本身并没有错,只是它们通常不是必需的,因为它们背后没有模块系统,而额外的层只会增加噪音。 通常有一个或两个级别的命名空间就足够了,还有一个用于内部细节的奇怪的额外级别(通常称为细节)。 如果过度使用,C++ 命名空间还有一些额外的规则可能会让您发现 - 例如参数相关查找,以及有关解析到父级别的规则。 WRT后者,取: namespace a{ namespace b{ int x; } } namespace b{ string x; } namespace a { b::x = 42; } 这是合法的吗? 发生的事情很明显吗? 您需要知道命名空间解析的优先级才能回答这些问题。 回答2 Java 包不是嵌套的,它们是扁平的。
  • 跨平台和语言(反)序列化(Cross-platform and language (de)serialization)
    问题 我正在寻找一种以最方便的方式序列化一堆 C++ 结构的方法,以便序列化可以跨 C++ 和 Java(至少)以及跨 32 位/64 位、大/小端平台移植。 要序列化的结构只包含数据,即它们是没有状态或行为的纯数据对象。 我们的想法是我们将结构序列化为一个八位字节 blob,我们可以“一般地”将其存储在数据库中并在以后读取。 因此避免在结构更改时更改数据库,也避免将每个数据成员分配给一个字段 - 即我们只希望一个表将所有内容“一般地”保存为二进制 blob。 这应该可以减少开发人员的工作,并且在结构更改时需要的更改更少。 我看过 boost.serialize 但不认为有办法启用与 Java 的兼容性。 在 Java 中继承 Serializable 也是如此。 如果有一种方法可以从 IDL 文件开始,这将是最好的,因为我们已经有了描述结构的 IDL 文件。 提前加油! 回答1 我在这里绊倒了,有一个非常相似的问题。 6 年后,这可能对您没有用,但希望对其他人有用。 有很多替代方案,不幸的是没有明显的赢家(尽管有人可能会争辩说 JSON 是明显的赢家)。 甚至谷歌也发布了多种竞争技术(所有这些显然都在内部使用): FlatBuffers:这个似乎符合原始问题的要求,具有有趣的基准测试并支持某种形式的 IDL(我个人不熟悉 IDL) Protocol Buffers:前面提到过。
  • Objective-C 和 C++ 的转换比较(casting comparison between Objective-C and C++)
    问题 好的,所以这可能是一个学术问题。 有人能告诉我 C++ 的转换运算符是否/如何转换为 Objective-C ......或者它们如何/为什么不需要? 我已经脱离 C++ 循环好几年了,似乎每次我转身时,他们都会添加一些新的关键字。 最近向我介绍了 C++ 的各种类型转换运算符 reinterpret_cast、static_cast、dynamic_cast 和 const_cast。 对于您需要使用所有这些类型的强制转换的情况何时出现,我有点模糊。 我已经使用 Objective-C 一两年了,并且对它感觉相当舒服。 (在那之前主要是一个 C 人)。 我试图理解为什么 C++ 似乎具有所有这些复杂性。 或者换句话说,Objective-C 缺少什么,它似乎没有(或不需要?)这么多类型的转换? 回答1 请参阅此问题的答案何时应使用 static_cast、dynamic_cast 和 reinterpret_cast? 关于每种类型转换的含义。 Objective-C 缺少什么,它似乎没有(或不需要?)这么多类型的转换? 与 C 相比,C++ 更关注类型安全。添加了许多强制转换运算符以明确许多不同的强制转换意图(并阻止人们由于其丑陋的形式而使用它)。 和, Objective-C 中没有 const 对象( const NSObject* ),并且与 C++ 不同,其他
  • c++ 不合逻辑的 >= 比较处理 vector.size() 很可能是因为 size_type 是无符号的(c++ illogical >= comparison when dealing with vector.size() most likely due to size_type being unsigned)
    问题 在处理 vector.size() aka size_type 时,我可以使用一些帮助来澄清这个奇怪的比较 vector<cv::Mat> rebuiltFaces; int rebuildIndex = 1; cout << "rebuiltFaces size is " << rebuiltFaces.size() << endl; while( rebuildIndex >= rebuiltFaces.size() ) { cout << (rebuildIndex >= rebuiltFaces.size()) << " , " << rebuildIndex << " >= " << rebuiltFaces.size() << endl; --rebuildIndex; } 我从控制台得到的是 rebuiltFaces size is 0 1 , 1 >= 0 1 , 0 >= 0 1 , -1 >= 0 1 , -2 >= 0 1 , -3 >= 0 如果我不得不猜测,我会说编译器盲目地将 rebuildIndex 强制转换为 unsigned 和 +- 但导致事情表现得很奇怪,但我真的不确定。 有人知道吗? 回答1 正如其他人指出的那样,这是由于 C++ 在比较具有不同符号的值时适用的一些违反直觉的规则; 该标准要求编译器将两个值都转换为unsigned 。
  • 负零 (-0.0) 与正零 (+0.0) 相比的行为(Behaviour of negative zero (-0.0) in comparison with positive zero (+0.0))
    问题 在我的代码中, float f = -0.0; // Negative 并与负零比较 f == -0.0f 结果为true 。 但 float f = 0.0; // Positive 并与负零比较 f == -0.0f 此外,结果将为true而不是false 为什么在这两种情况下结果都是真的? 这是一个 MCVE 来测试它(在coliru上直播): #include <iostream> int main() { float f = -0.0; std::cout<<"==== > " << f <<std::endl<<std::endl; if(f == -0.0f) { std::cout<<"true"<<std::endl; } else { std::cout<<"false"<<std::endl; } } 输出: ==== > -0 // Here print negative zero true 回答1 C++ 中的浮点运算通常是 IEEE-754。 这个范数不同于实数集的数学定义。 该规范为零值定义了两种不同的表示:正零和负零。 还定义了这两个表示必须比较相等,因此根据定义: +0.0 == -0.0 至于为什么会这样,David Goldberg 在其论文 What Every Computer Scientist Should Know About
  • 字符串文字的C ++比较(C++ Comparison of String Literals)
    问题 我是c ++新手(只是oldschool c)。 我儿子要求与此相关的帮助,我无法解释。 如果他问我“如何比较字符串”,我会告诉他使用strcmp(),但这不是让我感到困惑的原因。 这是他的要求: int main() { cout << ("A"< "Z"); } 将打印1 int main() { cout << ("Z"< "A"); } 也会打印1,但是 int main() { cout << ("Z"< "A"); cout << ("A"< "Z"); } 然后将打印10。单独地,两个cout语句都打印1,但是连续执行时,我得到了不同的答案? 回答1 您正在比较内存地址。 显然,您的编译器将字符串文字按其遇到的顺序放置在内存中,因此第一个要比第二个“小”。 由于在第一个代码段中首先看到“ A”,然后是“ Z”,因此“ A”要小一些。 由于它在第二个中首先看到“ Z”,因此“ Z”较小。 在最后一个代码段中,当第二个命令滚动时,它已经放置了文字“ A”和“ Z”。 回答2 字符串文字具有静态存储期限。 在所有这些比较中,都比较了编译器为字符串文字分配的内存地址。 与第一个遇到的字符串文字相比,编译器遇到的第一个字符串文字似乎以较低的地址存储在内存中。 因此在这个程序中 int main() { cout << ("Z"< "A"); cout << ("A"<
  • 【编译原理】语言认知之Java、Python、C++快速排序&三者运行效率与开发效率比较
    【编译原理】语言认知之Java、Python、C++快速排序&三者运行效率与开发效率比较 一、实验目的二、实验环境三、实验步骤四、快速排序程序五、实验结果六、总结 一、实验目的 强化对编译器两端的认识,了解语言多样性,了解语言特性对语言实现的影响。 二、实验环境 语言实验环境C++Dev C++PythonPyCharmJavaEclipse 三、实验步骤 1.了解快速排序的基本思想:即通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。2.快速排序的速度是非常快的,手敲的数字排序时间是0ms,所以先生成十万行数据 import random my_list = list(range(100000)) random.shuffle(my_list) print(my_list) 3.画流程图 四、快速排序程序 C++: #include <stdio.h> #include <stdlib.h> #include <time.h> void display(int* array, int size) { for (int i = 0; i < size; i++) { printf("%d ", array[i]); } printf("\n"); } int getStandard(int
  • odeint 的 runge_kutta4 与 Matlab 的 ode45 的比较(Comparison of odeint's runge_kutta4 with Matlab's ode45)
    问题 我想在 odeint C++ 库中使用runge_kutta4方法。 我已经在 Matlab 中解决了这个问题。 我在 Matlab 中解决x'' = -x - g*x'以下代码,初始值x1 = 1 , x2 = 0 ,如下 main.m clear all clc t = 0:0.1:10; x0 = [1; 0]; [t, x] = ode45('ODESolver', t, x0); plot(t, x(:,1)); title('Position'); xlabel('time (sec)'); ylabel('x(t)'); ODESolver.m function dx = ODESolver(t, x) dx = zeros(2,1); g = 0.15; dx(1) = x(2); dx(2) = -x(1) - g*x(2); end 我已经安装了 odeint 库。 我使用runge_kutta4代码如下 #include <iostream> #include <boost/numeric/odeint.hpp> using namespace std; using namespace boost::numeric::odeint; /* The type of container used to hold the state vector */
  • C/C++ 中的 NaN 比较规则(NaN comparison rule in C/C++)
    问题 对一段代码进行一些优化,代码的正确性取决于编译器如何处理 NaN。 我阅读了关于 NaN 的 IEEE-754 规则,其中指出: 当一个或两个操作数为 NaN 时,比较 EQ、GT、GE、LT 和 LE 返回 FALSE。 当一个或两个操作数为 NaN 时,比较 NE 返回 TRUE。 上述规则是否在 C/C++ 中强制执行? 回答1 C/C++ 不需要特定的浮点表示,也不需要任何与NaN比较为false 。 在 C++ 中,您可以使用std::numeric_limits::is_iec559检查所有浮点类型是否满足 IEEE 754: static constexpr bool is_iec559; 56当且仅当类型符合 IEC 559 标准时为真。 217 57对所有浮点类型都有意义。 217) 国际电工委员会标准 559 与 IEEE 754 相同。 对于其他浮点表示与NaN比较可能会或可能不会表现相同。 事实上,甚至不需要表示NaN本身。 见 std::numeric_limits<T>::has_quiet_NaN、std::numeric_limits<T>::has_signaling_NaN。 回答2 正如@AlexD 的回答中已经指出的那样, ==和!=运算符似乎不受NaN的IEEE 754行为的约束。 然而, <math.h
  • C++ char* 比较是如何工作的?(How does C++ char* comparison work?)
    问题 #include <iostream> int main() { if ("zabc" < "def") { std::cout << "Less.\n"; } } 上面的代码打印Less. . 我知道这不是在 C++ 中比较char*的正确方法,但是上面的代码如何打印Less. ? 回答1 该代码比较两个字符串的地址。 正式地说,这是未指定的行为,因为它们不是同一数组的元素,但在这种情况下,它可能说的是实话:第一个字符串的地址低于第二个字符串。 但你不能指望... 回答2 您只是在比较地址。 你需要使用 strcmp 回答3 这是比较地址。 对于由某些特定编译器编译的此代码的某些特定调用,“zabc”恰好位于比“def”更低的地址。 (它也可能位于更高的地址,具体取决于编译器,甚至可能针对同一可执行文件的不同调用。) 回答4 当你这样做时,编译器分配两个字符数组,一个用于“def”,一个用于“zabc”。 这是在编译时完成的。 由于“zabc”在“def”之前定义,您的编译器可能会给第一个地址较小的地址,尽管这是未定义的行为。 稍后比较地址时,“zabc”是“较小的”。 你应该看到,如果你做下一个,你仍然会打印“Less”。 if ("def" < "zabc") { std::cout << "Less.\n"; }
  • 错误:ISO C++ 禁止指针和整数之间的比较(Error:ISO C++ forbids comparison between pointer and integer)
    问题 我有以下几点: wxIntPtr* value; CreateRegKey(); if (regkeyexist) { if (regKey->HasValue("LoggingStatus")) { regKey->QueryValue("LoggingStatus", value); if (value == 1) 但是我得到了错误,因为 C++ 禁止指针和整数之间的比较 回答1 这应该可以编译,但我不知道它是否是您想要的: ... if (*value == 1) ... 回答2 您正在尝试将int与pointer进行比较 如果您确实想查看pointer是否为1 if (value == (wxIntPtr*)(1)) 否则,如果您尝试与 value指向的value进行比较 if (*value == 1) 虽然我不知道你为什么想做第一个:) 我认为您可能应该做的是以下内容: wxIntPtr value; // wxIntPtr on the stack ... regKey->QueryValue("LoggingStatus", &value); // Pass by reference to modify. if (value == 1) 大多数 Windows 编程都是这样完成的,API 调用会初始化您自己实例化的值和结构。 wxIntPtr* value可能
  • 在 C++ 中编写两个原始类型之间的重载比较 (==)(Write an oveloaded comparison (==) between two primative types, in C++)
    问题 正如本文所指出的,不可能重载比较运算符 (==) 以便双方都可以采用原始类型。 “不,C++ 语言要求您的运算符重载至少采用一个“类类型”或枚举类型的操作数。C++ 语言不会让您定义所有操作数/参数都是原始类型的运算符。” (parashift) 我想知道: **如果我真的需要使用 == 以非标准方式比较两个原语,有没有办法将它们隐式转换为其他类? 例如,以下代码适用于const char*比较,但它需要显式转换。 如果可能,我宁愿避免显式转换。 // With an explicit cast if(string("a")=="A") // True // Without the cast if("a"=="A") // False // An example overloaded function: bool operator == (string a, const char* b) { // Compares ignoring case } 在某些情况下,转换可能非常笨拙,尤其是当您需要在一个长表达式中进行多次转换时。 所以这就是为什么我正在寻找一种方法来自动将第一个输入(或两者)转换为 sting 类型。 编辑1: 另一种方法是编写一个isEqual(const char* a, const char* b)函数,但我想避免这种情况,因为如果我在大型 if-
  • 转:值得推荐的C/C++框架和库 (真的很强大)
    目录(?)[+] 值得学习的C语言开源项目 - 1 Webbench - 2 Tinyhttpd - 3 cJSON - 4 CMockery - 5 Libev - 6 Memcached - 7 Lua - 8 SQLite - 9 UNIX v6 - 10 NETBSD C 资源大全 标准库 框架 人工智能 异步事件循环 音频 生态学 压缩 并发性 容器 密码学 数据库 调试 游戏引擎 图形用户界面 图形 图像处理 国际化 Jason 日志 机器学习 数学 多媒体 网络 物理学 机器人学 科学计算 脚本 序列化 视频 虚拟机 Web应用框架 XML 多项混杂 软件 编译器 在线编译器 调试器 集成开发环境IDE 构建系统 静态代码分析 值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。 下载链接:http://home.tiscali.cz/~cz210552/webbench.html - 2. Tinyhttpd tinyhttpd是一个超轻量型Http Server,使用C语言开发
  • 指针比较(Pointer comparison)
    问题 C 和 C++ 中的指针是否支持标准中的比较运算符( > 、 <等)? 我想精确地比较数组位置。 回答1 在连续数组中比较内存偏移(指针)是可以的。 如果您的数组实现为链表(例如),则节点可能遍布内存,因此指针比较是无意义的。 回答2 是的,它们是可以比较的。 例如,请参阅标准中的“关系运算符”以获取更多信息,C99 中的 6.5.8 和 C++ 旧草案 (2006-11) 中的 5.9。