现在我已经学会了Swift(达到一个合理的水平),我正试图掌握标准库,但实际上它主要是ελληνικά给我!
所以一个特定的问题:我有一个字符串数组,我可以调用reverse().
let arr = ["Mykonos", "Rhodes", "Naxos"].reverse()
Run Code Online (Sandbox Code Playgroud)
现在天真地我以为我会从中找回一种类型的阵列.(例如Ruby有一个类似的方法,你传递一个数组并返回一个数组)
但arr现在实际上是类型
ReverseRandomAccessCollection<Array<String>>
Run Code Online (Sandbox Code Playgroud)
这实际上是一个符合CollectionType的结构:
public struct ReverseRandomAccessCollection<Base : CollectionType where Base.Index : RandomAccessIndexType> : _ReverseCollectionType
Run Code Online (Sandbox Code Playgroud)
这意味着我可以这样做:
for item in arr {
print(item)
}
Run Code Online (Sandbox Code Playgroud)
但我不能这样做
print(arr[0])
Run Code Online (Sandbox Code Playgroud)
为什么这样设计成这样?
Swift中的字典也实现了CollectionType,所以我可以这样做:
let dict = ["greek" : "swift sometimes", "notgreek" : "ruby for this example"].reverse()
Run Code Online (Sandbox Code Playgroud)
但字典不像数组一样排序,为什么我可以在dicts上调用reverse()?
奖励积分如果有人能指出我可以阅读的方向并改善我的Swift stdlib foo,Ευχαριστώ!
今天我通过了这个问题:C++ 11中COW std :: string实现的合法性
该问题的最多投票答案(35票赞成)说:
这是不允许的,因为根据标准21.4.1 p6,只允许迭代器/引用的失效
- 作为任何标准库函数的参数,将非const basic_string作为参数引用.
- 调用非const成员函数,除了operator [],at,front,back,begin,rbegin,end和rend.
对于COW字符串,调用非const运算符[]将需要复制(并使引用无效),上面的段落不允许这样做.因此,在C++ 11中拥有COW字符串已不再合法.
我想知道这种理由是否有效,因为C++ 03似乎对字符串迭代器失效有类似的要求:
引用basic_string序列元素的引用,指针和迭代器可能会被该basic_string对象的以下用法无效:
- 作为非成员函数的参数swap()(21.3.7.8),operator >>()(21.3.7.9)和getline()(21.3.7.9).
- 作为basic_string :: swap()的参数.
- 调用data()和c_str()成员函数.
- 调用非const成员函数,除了operator [](),at(),begin(),rbegin(),end()和rend().
- 除了返回迭代器的insert()和erase()形式之外的任何上述用法之后,第一次调用非const成员函数operator [](),at(),begin(),rbegin(),end ()或rend().
这些与C++ 11的不完全相同,但至少operator[]()在原始答案作为主要理由的部分是相同的.所以我想,为了证明C++ 11中COW std :: string实现的非法性,需要引用其他一些标准要求.需要帮助.
这个SO问题已经停止了一年多,所以我决定将其作为一个单独的问题提出来.如果这不合适,请告诉我,我会找到其他方法来澄清我的疑问.
有一个boost :: noncopyable我在我的库里有我自己的noncopyable类.在最新的C++标准中是否有std :: noncopyable或等效的敲门声?
这是一件小事,但是从这样一个阶级派生出来的意图更加清晰.
可以?如果是的话,我在哪里可以得到它的文件......如果没有,那么哪个是最好的选择?
是我还是c或c ++库中没有标准的修剪函数?是否有任何单一功能充当修剪?如果没有,谁能告诉我为什么修剪不是标准库的一部分?(我知道修剪是在提升)
我的修剪代码是
std::string trim(const std::string &str)
{
size_t s = str.find_first_not_of(" \n\r\t");
size_t e = str.find_last_not_of (" \n\r\t");
if(( string::npos == s) || ( string::npos == e))
return "";
else
return str.substr(s, e-s+1);
}
Run Code Online (Sandbox Code Playgroud)
test:cout << trim("\n\r \n\r \n\r \n \n \n文本在这里\n,返回\n\r \n\r \n\r \n"); -edit-我最想知道为什么它不在标准库中,BobbyShaftoe答案很棒.trim不是标准c/c ++库的一部分?
当文件prog.py与具有相同名称的本地模块(math.py)放在同一目录中时,如何访问标准库模块(比如数学)?
我问这个问题,因为我想创建uncertainties一个可以用作的包
import uncertainties
from uncertainties.math import *
Run Code Online (Sandbox Code Playgroud)
因此,不确定性目录中有一个本地数学模块.问题是我想从不确定性/ __ init__.py访问标准库数学模块.
我不想重命名不确定性.因为这个模块正是用于替换数学模块中的函数(具有处理数值不确定性的等价物).
PS:这个问题与我为执行不确定性计算而编写的模块有关,同时考虑了变量之间的相关性.
我知道大多数编译器都允许:
#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)
//和
#include <cstdio>
Run Code Online (Sandbox Code Playgroud)
但有人认为<stdio.h>实际上并不是C++标准.
真的吗?
我正在寻找定义,seq并遇到了这种奇怪.为什么所有这些函数都有相同/相似的定义?
seq :: a -> b -> b
seq = let x = x in x
inline :: a -> a
inline = let x = x in x
lazy :: a -> a
lazy = let x = x in x
Run Code Online (Sandbox Code Playgroud)
源代码中有更多此定义.这是怎么回事?
我从这个网站下载了Clang 3.6.2,并尝试使用Windows下的Code :: Blocks进行设置.不幸的是,由于它不知道在哪里,它无法编译一个简单的"hello world"程序iostream.
查看安装文件夹,它似乎没有包含标准库.为什么?我怎么得到它?