标签: standard-library

模板专业化VS函数重载

我注意到一本教科书,您可以为标准库函数提供自己的实现,例如swap(x,y)通过函数重载的模板特化.这对于可以从赋值交换以外的其他东西中受益的任何类型都是有用的,STL containers例如(我已经知道了已经写过的掉期).

我的问题是:

  1. 什么更好:模板专业化为您的专业交换实现,或函数重载提供您希望在没有模板的情况下使用的确切参数?

  2. 为什么更好?或者如果他们是平等的,为什么呢?

c++ stl overloading standard-library template-specialization

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

如何在没有强制的情况下将列表展平到列表?

我试图实现类似于unlist的功能,但类型不会被强制转换为向量,但会返回包含保留类型的列表.例如:

flatten(list(NA, list("TRUE", list(FALSE), 0L))
Run Code Online (Sandbox Code Playgroud)

应该回来

list(NA, "TRUE", FALSE, 0L)
Run Code Online (Sandbox Code Playgroud)

代替

c(NA, "TRUE", "FALSE", "0")
Run Code Online (Sandbox Code Playgroud)

将由...返回unlist(list(list(NA, list("TRUE", list(FALSE), 0L)).

从上面的例子中可以看出,扁平化应该是递归的.标准R库中是否有一个功能可以实现这一功能,或者至少还有一些其他功能可用于轻松有效地实现这一功能?

更新:我不知道从上面是否清楚,但非名单不应该被夷为平地,即flatten(list(1:3, list(4, 5)))应该返回list(c(1, 2, 3), 4, 5).

r list standard-library flatten type-coercion

49
推荐指数
4
解决办法
6128
查看次数

嵌入Python3没有标准库

编辑:我在这里问了一个相反的问题:如何使用标准库嵌入Python3

这里提供了Python2的解决方案:是否可以在没有标准库的情况下嵌入python?

但是,Python3失败Py_Initialize();了:

Fatal Python error: Py_Initialize: unable to load the file system  
codec ImportError: No module named 'encodings'
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为py3源文件默认为utf-8.所以它似乎只需要一个外部二进制文件来解析py3源文件.

那么该怎么办?

看起来我需要encodings在我的系统Python安装中找到二进制文件,将其复制到我的项目树中,并且可能设置一些环境变量PYTHONPATH(?)以便我的libpython.dylib可以找到它.

有可能避免这种情况吗?如果没有,任何人都可以澄清我需要采取的步骤吗?会不会再打嗝了?


注意:对于后代,这是我在OSX上链接到我的项目的独立libpython.dylib的方法:

首先,我找到我的系统Python的库:( /usr/local/Frameworks/Python.framework/Versions/3.4/Python在我的情况下,它与自制软件一起安装).

现在我:

  • 将.dylib复制到我的项目文件夹创建中 ./Libs/libpython3.4.1_OSX.dylib

  • 进入build settings -> linking并设置other linker flags-lpython3.4.1_OSX

此时它似乎有效.但是,如果您知道尝试在新的OSX安装上构建它,它将失败.这是因为:

$ otool -D ./libpython3.4.1_OSX.dylib 
./libpython3.4.1_OSX.dylib:
/usr/local/Frameworks/Python.framework/Versions/3.4/Python
Run Code Online (Sandbox Code Playgroud)

.dylib仍然坚持它的旧位置.我真的很奇怪.dylib包含一个指向其位置的链接,因为任何使用它的东西必须知道它在哪里才能首先调用它!

我们可以用以下方法纠正:

$ install_name_tool -id @rpath/libpython3.4.1_OSX.dylib libpython3.4.1_OSX.dylib
Run Code Online (Sandbox Code Playgroud)

但是在我们的Xcode项目中我们必须:

  • 进入build phases.添加一个copy files复制libpython3.4.1_OSX.dylib到的步骤Frameworks(这是放置它的正确位置).
  • 进入build settings -> linking并设置runpath …

python embedding standard-library python-3.x

49
推荐指数
1
解决办法
2108
查看次数

cout,cin,cerr和clog中的"c"是什么意思?

"c"在cout,cin,cerr和clog中的含义是什么意思?

我会说,char但我没有找到任何确认它.

c++ iostream standard-library

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

子类/继承标准容器?

我经常在Stack Overflow上阅读这些语句.就个人而言,我没有发现任何问题,除非我以多态方式使用它; 即我必须使用virtual析构函数.

如果我想扩展/添加标准容器的功能那么什么是比继承一个更好的方法?将这些容器包装在自定义类中需要更多的努力并且仍然是不洁净的.

c++ inheritance standard-library

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

std :: mt19937需要预热吗?

我已经读过许多伪随机数生成器需要许多样本才能"预热".这是使用std :: random_device种子std :: mt19937的情况,还是我们可以期待它在构建后准备就绪?有问题的代码:

#include <random>
std::random_device rd;
std::mt19937 gen(rd());
Run Code Online (Sandbox Code Playgroud)

c++ random standard-library mersenne-twister c++11

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

将非空终止字符串传递给C中的strncmp是否合法?

我有一个16字节的数组,其中包含可执行文件的段名.

char segname[16];
Run Code Online (Sandbox Code Playgroud)

如果段名长度小于16个字节,则其余部分用空字节填充.否则,没有终止空字节.

我想比较segname各种字符串,例如__text.

strncmp使用非空终止字符串调用是否合法?

这篇文章假设它是合法的.此源代码也使其合法化.但是我的男人的页面说:

strncmp()函数按字典顺序比较以null结尾的字符串s1s2.

传递给strncmp的大小将是segname.

我想知道我应该参考什么.

c standards standard-library strncmp

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

什么时候C++需要#include <new>库?

根据运营商新的参考条目(http://www.cplusplus.com/reference/std/new/operator%20new/):

全局动态存储操作员功能在标准库中是特殊的:

  • operator new的所有三个版本都在全局命名空间中声明,而不是在std命名空间中声明.
  • 第一个和第二个版本在C++程序的每个翻译单元中隐式声明:不需要包含标题以使它们存在.

在我看来,这意味着在C++程序的每个翻译单元中都没有隐式声明第三版operator new(placement new),<new>并且需要包含标题才能使它存在.那是对的吗?

如果是这样,如何使用g ++和MS VC++ Express编译器,我似乎可以#include <new>在我的源代码中使用第三版new编译代码?

另外,关于operator new的MSDN标准C++库参考条目为包含该#include <new>语句的三种形式的operator new提供了一些示例代码,但是如果没有这个包含,该示例似乎对我来说编译和运行相同?

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass 
{
public: 
   MyClass( )
   {
      cout << "Construction MyClass." << this << endl;
   };

   ~MyClass( )
   {
      imember = 0; cout << "Destructing MyClass." << this << endl;
   };
   int imember;
};

int main( ) 
{
   // The first form of new …
Run Code Online (Sandbox Code Playgroud)

c++ include standard-library new-operator

44
推荐指数
3
解决办法
3万
查看次数

我什么时候应该使用std :: bind?

每次我需要使用时std::bind,我最终都会使用lambda.那么我std::bind什么时候应该使用?我刚刚从一个代码库中删除它,我发现lambdas总是更简单,更清晰std::bind.是不是std::bind完全没必要?它不应该在将来被弃用吗?我std::bind什么时候应该更喜欢lambda函数?(必须有一个原因,它与lambda一起进入标准.)

我也注意到越来越多的人熟悉lambdas(所以他们知道lambdas做了什么).但是,很少有人熟悉std::bindstd::placeholders.

c++ lambda bind standard-library c++11

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

为什么需要这个强制转换为bool?

template<typename InputIterator, typename Predicate>
inline InputIterator
find_if(InputIterator first, InputIterator last, Predicate pred, input_iterator_tag)
{
    while (first != last && !bool(pred(*first)))
         ++first;

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

我在GCC 4.7.0附带的C++标准库的实现的源代码中遇到了这个片段.这是find_if输入迭代器的特化.我清理了前导下划线,使其更具可读性.

他们为什么bool在谓词上使用强制转换?

c++ gcc casting standard-library

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