小编ale*_*son的帖子

如何计算向量递归类型中的非空向量

我有一种类型,可以定义为矢量向量的矢量...整数类型的向量.例:

std::vector<std::vector<std::vector<std::vector< std::vector<signed char> > > > > _data;
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种优雅的方法来确定更深层次的非空向量的数量.我可以使用像4这样的封装循环来做那个例子

for (it0 = data.cbegin() ; it0 != _data.cend() ; ++it0)
 for (it1 = *it0.cbegin() ; it1 != *it0.cend() ; ++it1)
   for (it2 = *it1.cbegin() ; it2 != *it1.cend() ; ++it2)
      for (it3 = *it2.cbegin() ; it3 != *it2.cend() ; ++it3)
          nonEmpty += (unsigned int) (*it3.empty());
Run Code Online (Sandbox Code Playgroud)

但是,我如何创建一个模板(支持向量,列表或任何类型的容器共享相同的API)功能,以便为任何深度(超过4级)执行此操作?我认为递归是正确的方法,但不知道如何使用Template ...

欢迎提供所有帮助和建议,因为我非常确定有多种解决方案.

c++ stl c++98

7
推荐指数
1
解决办法
241
查看次数

如何将2 uint的结构转换为double

我有一个如下结构:

struct pts_t 
{
    uint32_t lsb;
    uint32_t msb;
};
Run Code Online (Sandbox Code Playgroud)

我想把它变成双重的.直接写是否安全:

pts_t t; 

double timestamp = t;
Run Code Online (Sandbox Code Playgroud)

更复杂的,如果结构类型是C dll API的一部分,没有"打包"属性(对于所有编译器),在这种情况下,我必须pts_t*通过API 将接收复制到我创建的pts_t实例来控制结构包装?

void f(pts_t* t)
{ 
   pts_t myt; myt.lsb = t->lsb; myt.msb = t->msb;

   double timestamp = *(double*)(&myt.lsb);
}
Run Code Online (Sandbox Code Playgroud)

c

6
推荐指数
1
解决办法
1470
查看次数

为什么地图上的BOOST_FOREACH只能使用typedef

我试着写一个简单的循环map<int, int>元素,我想知道为什么我使用的第一个语法不起作用/编译?

我写的第一个版本如下,它不能用VS'2008/boost版本1.44编译:

std::map<int, int> myMap;
...
BOOST_FOREACH(map<int, int>::value_type &p, myMap)
{
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我重写下面的代码,编译是可以的,但为什么呢?

typedef std::map<int, int> myMap_t;
myMap_t myMap;
...
BOOST_FOREACH(myMap_t::value_type &p, myMap)
{
}
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-foreach

5
推荐指数
1
解决办法
179
查看次数

如何检查void*是否指向对象类型的有效实例上的指针?

我正在寻找最常见和最健壮的方法来检查是否void*可以在给定的C++对象类型中进行转换.您可以在下面看到有关上下文的一些信息.

当我为DLL定义一个C API时,我经常使用void*来隐藏我后面使用的C++对象(如下所示)

typedef void* Instance_t;
int createInstance(Instance_t* pInst);
int processing(Instance_t inst, uint8_t* pBuf, size_t bufLength);
Run Code Online (Sandbox Code Playgroud)

当我createInstance的代码cast像这样的指针:

int createInstance(Instance_t* pInst)
{ 
   MyClass* ptr = new MyClass();
   *pInst = (void*)(ptr);
   //.... etc
   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

但问题是我们后来如何定义我们定义的所有其他C函数,检查void*我们收到的值是否有效 MyClass*.我认为我们不能,因为C++转换操作符都不是真正的类型安全就是这种情况(偶数dynamic_cast).

现在我最好的解决方案是使用C cast(或a reinterpret_cast),如果一切正常,调用IsValid函数定义MyClass.

你有更好的方法来检查吗?

c c++ dll pointers object

4
推荐指数
2
解决办法
2317
查看次数

为什么fstream.read工作而不是>>?

我想知道为什么我不能使用>>an 的运算符std::ifstream从二进制文件中读取unsigned int.

#include <fstream>

    int main(int argc, char* argv[])
    {
        std::ifstream in(argv[1]);
        if(in.fail())
            return -1;

        unsigned int atom_size = 0;

        in.read(reinterpret_cast<char*>(&atom_size), 4);
        in >> atom_size;

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

当我使用时,in.read我得到了我想要的值,但是当我使用>>运算符时,我的atom_size变量不会改变.为什么?

c++ fstream

3
推荐指数
1
解决办法
210
查看次数

2D点的排列

我想探索2d点的所有排列(2D阵列中的x,y坐标)我的2d点结构是:

struct pos_t {
    int x; int y; 
    pos_t(){x = 0 ; y = 0;} 
    pos_t(int X, int Y){x=X; y=Y;}
    pos_t(pos_t const & r) {x = r.x; y=r.y;}
    pos_t& operator=(pos_t const & r) {x = r.x; y=r.y; return *this;}
    bool operator < ( pos_t& p2)
    {
        return (x+y) < (p2.x+p2.y);
    }
    friend ostream& operator << (ostream &o, const pos_t& p)
    {
        return o << "(" << p.x << "," << p.y << ")";
    }
};
Run Code Online (Sandbox Code Playgroud)

使用pos_t调用treasurePos(vector<pos_t>)的向量,我使用下面的代码迭代其他不同的排列并显示每个.

    do { …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

2
推荐指数
1
解决办法
660
查看次数

使用 XSD 进行 Xerces XML 验证

我尝试使用给定的 XSD 语法文件验证 XML 文件。但是现在它总是返回错误说明no declaration found for element ...,并且对于我的 XML 文件中的每个元素或属性。

为了创建 XSD,我使用了那个免费的在线 XSD 生成器,如果我使用同一站点上的 (Validator)[http://www.freeformatter.com/xml-validator-xsd.html] 在该 XSD 中检查我的 xml,则所有内容看起来不错。

那么为什么 Xerces 会失败呢?

我使用以下代码进行验证:

      XercesDOMParser domParser;
      if (domParser.loadGrammar(schemaFilePath.c_str(), Grammar::SchemaGrammarType) == NULL)
      {
        throw Except("couldn't load schema");
      }

      ParserErrorHandler parserErrorHandler;

      domParser.setErrorHandler(&parserErrorHandler);
      domParser.setValidationScheme(XercesDOMParser::Val_Always);
      domParser.setDoNamespaces(true);
      domParser.setDoSchema(true);
      domParser.setValidationSchemaFullChecking(true);

      domParser.parse(xmlFilePath.c_str());
      if(domParser.getErrorCount() != 0)
      {     
        throw Except("Invalid XML vs. XSD: " + parserErrorHandler.getErrors()); //merge a error coming from my interceptor ....
      }
Run Code Online (Sandbox Code Playgroud)

我的 XML 测试文件是:

<?xml version="1.0" encoding="UTF-8" ?>
<schemes signature="9fadde05"> …
Run Code Online (Sandbox Code Playgroud)

c++ xerces

2
推荐指数
1
解决办法
1万
查看次数

分隔字符串的最佳ASCII字符是什么?

我在一个系统上工作,客户可以向我发送编码为utf-8的unicode字符串.在某些时候,我打包/序列化(C++)其数据使用一种逗号分隔列表,如:

fieldName:value,other fieldname:value, etc....
Run Code Online (Sandbox Code Playgroud)

该字符串是一个进程的goind,如果被python脚本捕获以提取字典:

 {"fieldName":"value", etc..... }
Run Code Online (Sandbox Code Playgroud)

提取我使用简单的正则表达式re.compile(ur"(.*?):(.*?)(?:,|$)", re.UNICODE).但我知道用户可以使用,:发送的字符串,所以我正在寻找可以在C++级别使用的最佳ASCII代码来替换我现在使用的逗号?

\xF8(248)一个不错的选择,如果它必须有一些用户无法使用键盘输入!欢迎任何帮助和建议.

c c++ python string unicode

2
推荐指数
2
解决办法
1064
查看次数

extern const 字符串的链接错误

我遇到了以下链接问题。

在第一个编译单元中,我在全局空间 ea 中定义const string如下:

const string test_string = "blahblah";
Run Code Online (Sandbox Code Playgroud)

后来,在 2dn 编译单元中,我想重用该字符串,我写道:

extern string test_string;
Run Code Online (Sandbox Code Playgroud)

但联动过程中失败(未定义的符号),我发现链接的唯一方法是使用const char*代替const string

我想了解为什么会这样?

c++ gcc hyperlink visual-c++

2
推荐指数
1
解决办法
259
查看次数

为什么strtoul不能按预期工作?

嗨,我写了一个小测试程序来检查我写的函数如何将字符串(十六进制数)转换为无符号整数,我发现代码的行为有所不同,具体取决于我使用的编译器或系统.

我编译了下面的代码:
(1)在ubuntu12上的centos C++ 4.3.2 https://ideone.com/LlcNWw(2)g
++ 4.4.7 on centos6(64bits)
(3)g ++ 4.6.3( 64位)
(4)gg 4.9.3在cygwin(32位)环境中

正如预期的那样(1)和(4)返回AND IT正是正确的结果,因为第一个值'0x210000000'对于32位值来说是大的....

Error while converting Id (0x210000000).
success
Run Code Online (Sandbox Code Playgroud)

但是(2)和(3)返回

success
success
Run Code Online (Sandbox Code Playgroud)

所以问题就是为什么在不同平台上使用不同编译器构建的相同简单C代码返回相同的结果...以及为什么'strtoul("0x210000000",......)'没有将'errno'设置为'ERANGE'说第33到37位超出范围.

更多关于平台的追踪(3)给出:

Id (0x210000000) as ul = 0x10000000  - str_end  - errno 0.
sucess
Id (0x10000000) as ul = 0x10000000  - str_end  - errno 0.
sucess




   /* strtoul example */
#include <stdio.h>      /* printf, NULL */
#include <stdlib.h>     /* strtoul */
#include <errno.h>

signed int GetIdentifier(const char* idString)
{
  char *str_end;
  int id …
Run Code Online (Sandbox Code Playgroud)

c c++ gcc

0
推荐指数
1
解决办法
389
查看次数

标签 统计

c++ ×9

c ×4

gcc ×2

boost ×1

boost-foreach ×1

c++11 ×1

c++98 ×1

dll ×1

fstream ×1

hyperlink ×1

object ×1

pointers ×1

python ×1

stl ×1

string ×1

unicode ×1

visual-c++ ×1

xerces ×1