我有一种类型,可以定义为矢量向量的矢量...整数类型的向量.例:
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 ...
欢迎提供所有帮助和建议,因为我非常确定有多种解决方案.
我有一个如下结构:
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) 我试着写一个简单的循环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) 我正在寻找最常见和最健壮的方法来检查是否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.
你有更好的方法来检查吗?
我想知道为什么我不能使用>>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变量不会改变.为什么?
我想探索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) 我尝试使用给定的 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) 我在一个系统上工作,客户可以向我发送编码为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)一个不错的选择,如果它必须有一些用户无法使用键盘输入!欢迎任何帮助和建议.
我遇到了以下链接问题。
在第一个编译单元中,我在全局空间 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。
我想了解为什么会这样?
嗨,我写了一个小测试程序来检查我写的函数如何将字符串(十六进制数)转换为无符号整数,我发现代码的行为有所不同,具体取决于我使用的编译器或系统.
我编译了下面的代码:
(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)