我一直在为这个问题尝试不同的搜索术语,我只是在谷歌和stackoverflow上发现噪音.如果我使用C++的标准库(std)编写代码,基本上可以保证为Windows,Mac和Linux编译(并希望按预期工作)?
在C中向后读取文件的最佳方法是什么?我知道一开始你可能会认为这没用,但大多数日志等都会在文件末尾附加最新的数据.我想从文件向后读取文本,将其缓冲为行 - 即
abc
def
ghi
应该读行ghi,def,abc.
到目前为止,我尝试过:
#include <stdio.h>
#include <stdlib.h>
void read_file(FILE *fileptr)
{
char currentchar = '\0';
int size = 0;
while( currentchar != '\n' )
{
currentchar = fgetc(fileptr); printf("%c\n", currentchar);
fseek(fileptr, -2, SEEK_CUR);
if( currentchar == '\n') { fseek(fileptr, -2, SEEK_CUR); break; }
else size++;
}
char buffer[size]; fread(buffer, 1, size, fileptr);
printf("Length: %d chars\n", size);
printf("Buffer: %s\n", buffer);
}
int main(int argc, char *argv[])
{
if( argc < …Run Code Online (Sandbox Code Playgroud) 我对C和C++编程的众多标准和接口感到困惑.有ANSI C,ISO C,GLIBC,POSIX,Win32,MFC等.这些标准之间有什么区别,它们如何相互关联?在什么情况下你会选择一个特定的标准?是否有显示关系的图表?
我知道Swift不使用名称空间,但是这些名称是在每个模块中定义的.首先,我不太清楚如何避免名称冲突 - 随意详细说明.
不过,我的主要问题是:假设我想要一个不使用NSTreeNode的树结构,所以我创建了自己的名为"TreeNode"的类.现在让我们假设Apple决定在Swift的标准库中包含一个用于构建树的类,并且正如预期的那样,他们将其命名为"TreeNode".那么会发生什么?我的自定义TreeNode将与标准库的TreeNode冲突......在这种情况下我是否必须更改所有代码?或许Apple会承诺Swift的标准库将来不会改变?
编辑:问题在这里得到解答(感谢@Martin R的评论)
numeric_limits特性应该是获得各种类型信息的一般方式,能够做到这样的事情
template<typename T>
T min(const std::vector<T>& vect)
{
T val = std::numeric_limits<T>::min();
for(int i=0 ; i<vect.size() ; i++)
val = max(T, vect[i]);
return val;
}
Run Code Online (Sandbox Code Playgroud)
问题是(至少使用MS Visual Studio 2008)numeric_limits <int> :: min()返回最小的负数,而numeric_limits <double> :: min()返回最小的正数!
谁知道这个设计背后的理性呢?是否有更好的(推荐?)方式使用numeric_limits?在我上面的具体功能中,我当然可以将T初始化为vect [0],但这不是我要找的答案.
又见(浮点专用)的讨论 在这里
我有一个std::multiset存储元素class A.我operator<为这个课提供了自己的实现.我的问题是,如果我在这个multiset中插入两个等效对象,他们的顺序是否有保证?例如,首先我将一个对象a1插入到集合中,然后将一个等效对象a2插入到该集合中.当我遍历集合时,我可以期待a1之前a2的结果吗?如果不是,有没有办法用multiset实现这个目的?
我刚刚开始学习Haskell,并且会发现查看Haskell函数是如何实现的非常有用.我已经能够在不同的问题上找到标准前奏曲,但我现在对Data.List感兴趣.有没有办法找到这些功能的来源?
我真的很想看到排列和结点(其余的,但这些对我来说最有趣).
下面的C++程序应该返回一个严格的正值.然而,它返回0.
怎么了 ?我怀疑是双重转换,但我无法弄清楚为什么以及如何.
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
int main()
{
vector<double> coordinates;
coordinates.push_back(0.5);
coordinates.push_back(0.5);
coordinates.push_back(0.5);
cout<<inner_product(coordinates.begin(), coordinates.end(), coordinates.begin(), 0)<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我试图创建一个使用智能指针的自定义内存分配器.我没有发布代码,因为它太大而且没有添加太多信息.然后我用一个测试它std::vector.它在Xcode上运行得非常好.但是当我尝试在Visual Studio 12(2013)中构建相同的代码时,构建失败并出现以下错误:
... vector(873):错误C2660:'
std::_Wrap_alloc< my_allocator< int > >::construct':函数不带2个参数
问题出在push_back方法中:
void push_back(value_type&& _Val)
{
....
this->_Getal().construct(this->_Mylast,
_STD forward<value_type>(this->_Myfirst[_Idx]));
....
}
Run Code Online (Sandbox Code Playgroud)
错误消息有点令人困惑.真正的问题是this->_Mylast类型my_allocator< int >::pointer,它是一个智能指针,而构造方法是期望的int*.
所以,问题很简单:自定义内存分配器中使用的指针类型有哪些要求?应该X::pointer可以转换为原始指针?如果是的话,它会让它们变得毫无用处.
实际上我希望这行代码看起来像:
this->_Getal().construct(addressof(*(this->_Mylast)),
_STD forward<value_type>(this->_Myfirst[_Idx]));
Run Code Online (Sandbox Code Playgroud)
让我们尝试在C++标准中找到答案,其中说:
[17.6.3.5-5]分配器类型X应满足CopyConstructible(17.6.3.1)的要求.的
X::pointer,X::const_pointer,X::void_pointer,和X::const_void_pointer类型应满足NullablePointer(17.6.3.3)的要求.对这些类型的构造函数,比较运算符,复制操作,移动操作或交换操作不应通过异常退出.X::pointer并且X::const_pointer还应满足随机访问迭代器的要求(24.2)
如果我们看看NullablePointer reqs,他们会添加一些其他要求:
[17.6.3.3] NullablePointer类型是一种类似指针的类型,支持空值.如果符合以下条件,则类型P满足NullablePointer的要求:
(1.1) - P满足EqualityComparable,DefaultConstructible,CopyConstructible,CopyAssignable和Destructible的要求......
如果我检查随机访问迭代器的要求,我也没有找到任何明确提到它的转换为原始指针.但是在很少的地方使用了方法addressof(例如24.2.1-5).
此外,它并不是Microsoft std::vector实现中唯一X::pointer与假定原始指针相等的地方.我想知道,我错过了什么?
编辑:我将在这里添加一段my_allocator deffinition:
class my_allocator
{
public:
typedef std::size_t size_type;
typedef std::ptrdiff_t …Run Code Online (Sandbox Code Playgroud) 我试图在一个(最终多平台)C++应用程序中嵌入Python.
重要的是我的应用程序包含自己的Python实现(与blender一样),因此它完全是自包含的.(否则它将成为配置雷区).
我有两个选择:
(2)需要什么?
有了这些信息,我就可以平衡每种方法的优点与设置它所需的工作量.
我的嵌入式Python将供我自己使用(而不是任何用户区脚本) - 主要是控制流/游戏逻辑.我将需要很少的标准库 - 也许我可以通过在必要时隧道回C++将其降低到0 - 例如,如果我需要一个随机数,我可以创建一个C++例程并从Python访问它.我已经涵盖了所有这些.
然而,它开始看起来好像即使最小的安装也必须包含一些stdlib组件,这提示了一个问题:"如果我必须包含一些,也许最好包括所有!"