我正在尝试学习STL库,我遇到了一个奇怪的问题.此代码完美编译:
void Show(vector<int> myvec)
{
vector<int>::iterator it;
cout << "Vector contains:";
for( it = myvec.begin(); it < myvec.end(); it++)
{
cout << " " << *it;
}
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
虽然这个在编译时给我一个错误信息:
template <class T>
void Show2(vector<T> myvec)
{
vector<T>::iterator it;
cout << "Vector contains:";
for( it = myvec.begin(); it < myvec.end(); it++)
{
cout << " " << *it;
}
cout << endl;
}
Run Code Online (Sandbox Code Playgroud)
错误是:
$ g++ hello.cpp
hello.cpp: In function ‘void Show2(std::vector<T, std::allocator<_Tp1> >)’:
hello.cpp:19: error: expected ‘;’ …Run Code Online (Sandbox Code Playgroud) 我构建了一个最小的工作示例来显示我使用STL迭代器遇到的问题.我正在使用istream_iterator以下内容读取floatss(或其他类型)std::istream:
#include <iostream>
#include <iterator>
#include <algorithm>
int main() {
float values[4];
std::copy(std::istream_iterator<float>(std::cin), std::istream_iterator<float>(), values);
std::cout << "Read exactly 4 floats" << std::endl; // Not true!
}
Run Code Online (Sandbox Code Playgroud)
这将读取所有可能的floatss,直到EOF为values固定大小,4,所以现在显然我想限制范围以避免溢出并准确读取/最多4个值.
使用更多"正常"迭代器(即RandomAccessIterator),提供begin+4的不是你要做的结束:
std::copy(begin, begin+4, out);
Run Code Online (Sandbox Code Playgroud)
准确阅读4个元素.
如何做到这一点std::istream_iterator?显而易见的想法是将呼叫更改std::copy为:
std::copy(std::istream_iterator<float>(std::cin), std::istream_iterator<float>(std::cin)+4, values);
Run Code Online (Sandbox Code Playgroud)
但(相当可以预见)这不编译,没有候选人operator+:
g++ -Wall -Wextra test.cc
test.cc: In function ‘int main()’:
test.cc:7: error: no match for ‘operator+’ in ‘std::istream_iterator<float, char, std::char_traits<char>, long int>(((std::basic_istream<char, std::char_traits<char> >&)(& std::cin))) …Run Code Online (Sandbox Code Playgroud) 我今天正在阅读手册并注意到各种迭代器.对我来说,似乎他们都毫无意义; 除非您更喜欢它们的语法,或者不知道如何编写递归函数,否则我没有理由使用它们.是否有任何理由在PHP中使用内置迭代器而不仅仅是编写循环或制作递归方法?
我只是在寻找事实反应,而不是主观偏好(即:我不在乎你是否认为它更"可读"或"更面向对象",我想知道它们是否更快,提供的功能可以滚动自己的时候就不会实现,等等.
我正在玩迭代,更具体地说是yieldPython中的运算符.在使用测试驱动开发来开始编写新的可迭代时,我想知道什么是最短的代码可以使迭代的这个简单测试通过:
def test():
for x in my_iterable():
pass
Run Code Online (Sandbox Code Playgroud)
我能想到的最短版本是:
def my_iterable():
for i in []:
yield i
Run Code Online (Sandbox Code Playgroud)
是否可以编写更简单,更短或更漂亮(pythonic)的版本?
在许多语言中,有一些生成器可以帮助初始化集合.在C++中,如果想要统一初始化向量,可以编写:
std::vector<int> vec(10, 42); // get 10 elements, each equals 42
Run Code Online (Sandbox Code Playgroud)
如果想要动态生成不同的值,该怎么办?例如,用10个随机值或从0到9的连续数字初始化它?这种语法很方便,但在C++ 11中不起作用:
int cnt = 0;
std::vector<int> vec(10, [&cnt]()->int { return cnt++;});
Run Code Online (Sandbox Code Playgroud)
有没有一种通过迭代函数调用初始化集合的好方法?我目前使用这种丑陋的模式(没有比循环更可读/更短):
std::vector<int> vec;
int cnt = 0;
std::generate_n(std::back_inserter(vec), 10, [&cnt]()->int { return cnt++;});
Run Code Online (Sandbox Code Playgroud)
有一件事会有所帮助,它可以解释缺少第一个构造函数.我可以设想一个迭代器,它接受一个函数和一些调用,以便构造函数
vector ( InputIterator first, InputIterator last);
Run Code Online (Sandbox Code Playgroud)
适用.但我在标准库中找不到这样的东西.我错过了吗?还有另一个原因导致第一个构造函数没有达到标准吗?
我有一个带签名的功能:
function(std::vector<double> vector);
Run Code Online (Sandbox Code Playgroud)
而且我已经暴露了它,但它没有接受Python列表.我已经查看了其他的SO答案,并且大多数都涉及更改函数以接受boost :: python :: lists,但我不想更改函数.我想我可以使用vector_indexing_suite为这个函数编写一个简单的包装器,但是我有很多这种形式的函数,而不愿为每一个函数编写一个包装器.有没有办法自动生成Python list-> std :: vector映射?
我使用的是带有8GB内存和1.7GHz Core i5的Python 2.7.5 @ Mac OS X 10.9.3.我测试了时间消耗如下.
d = {i:i*2 for i in xrange(10**7*3)} #WARNING: it takes time and consumes a lot of RAM
%time for k in d: k,d[k]
CPU times: user 6.22 s, sys: 10.1 ms, total: 6.23 s
Wall time: 6.23 s
%time for k,v in d.iteritems(): k, v
CPU times: user 7.67 s, sys: 27.1 ms, total: 7.7 s
Wall time: 7.69 s
Run Code Online (Sandbox Code Playgroud)
似乎iteritems更慢.我想知道iteritems比直接访问dict有什么好处.
更新:获得更准确的时间配置文件
In [23]: %timeit -n 5 for k in d: …Run Code Online (Sandbox Code Playgroud) 是否可以对迭代器定义的列表(列表的子集)的部分进行排序std::sort?
即,std::list唯一可用的排序是通过一种方法(http://en.cppreference.com/w/cpp/container/list/sort),我希望能够使用它的迭代器对列表的一部分进行排序std::sort.例如
std::sort(listItrStart, listItrEnd, [](T& a, T& b){ return a.something() < b.something()});
Run Code Online (Sandbox Code Playgroud)
我感谢一旦对项目执行了移动操作,迭代器将变为无效,我认为这意味着在下一次"比较"之前,迭代器无法对列表进行排序而无需重新迭代到所需位置?
在这种情况下,排序子列表的最佳做法是什么,而不为此过程填充另一个容器(如果有的话)?
非常感谢.
我还没有找到一个很好的例子,说明如何使用php RegexIterator递归遍历目录.
最终的结果是我想指定一个目录并查找其中包含一些给定扩展名的所有文件.比如说只有html/php扩展名.此外,我想过滤掉.Trash-0,.Trash-500等类型的文件夹.
<?php
$Directory = new RecursiveDirectoryIterator("/var/www/dev/");
$It = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($It,'/^.+\.php$/i',RecursiveRegexIterator::GET_MATCH);
foreach($Regex as $v){
echo $value."<br/>";
}
?>
Run Code Online (Sandbox Code Playgroud)
到目前为止我得到的结果是:致命错误:带有消息'RecursiveDirectoryIterator :: __ construct(/media/hdmovies1/.Trash-0)的未捕获异常'UnexpectedValueException'
有什么建议?
我想避免得到ConcurrentModificationException.我该怎么办?