是否可以为现有的POD类型元素数组创建类似STL的容器,甚至只是STL样式的迭代器?
例如,假设我有一个int数组.能够直接在此数组上调用某些STL函数(例如find_if,count_if或sort)会很方便.
非解决方案:复制整个数组,甚至只是引用元素.目标是节省内存和时间,同时希望允许使用其他STL算法.
我最近了解了在C++中使用反向迭代器的正确方法(特别是当你需要擦除它时).(见这个问题,并且这一个.)
这就是你应该这样做的方式:
typedef std::vector<int> IV;
for (IV::reverse_iterator rit = iv.rbegin(), rend = iv.rend();
rit != rend; ++rit)
{
// Use 'rit' if a reverse_iterator is good enough, e.g.,
*rit += 10;
// Use (rit + 1).base() if you need a regular iterator e.g.,
iv.erase((rit + 1).base());
}
Run Code Online (Sandbox Code Playgroud)
但我认为这样做要好得多(不要这样做,不符合标准,正如MooingDuck指出的那样):
for (IV::iterator it = iv.end(), begin = iv.begin();
it-- != begin; )
{
// Use 'it' for anything you want
*it += 10;
iv.erase(it); …Run Code Online (Sandbox Code Playgroud) 我有一个ArrayList,我正在使用迭代器来运行它.我需要找出下一个类型的对象:
Iterator vehicleIterator = vehicleArrayList.iterator();
while(vehicleIterator.hasNext())
{
//How do I find the type of object in the arraylist at this point
// for example, is it a car, bus etc...
}
Run Code Online (Sandbox Code Playgroud)
谢谢
C++要求OutputIterator类型X支持表单的表达式r++,其中r是一个实例X.此后缀增量必须在语义上等效于:
(*) { X tmp = r; ++r; return tmp; }
并且必须返回可转换为的类型X const&.在C++ 11中,请参见24.2.4(但这不是新的).它说,在同一部分
输出迭代器上的算法绝不应该尝试两次通过相同的迭代器.它们应该是单通道算法.
给出(*),上面说我复制返回值就像 X a(r++);
假设r在递增之前是dereferencable,但没有取消引用.它是否需要a被取消参考?如果是这样,必须X a(r++); *a = t;执行相同的任务*r++ = t;吗?是否有任何(其他)条件a和r?
否则,假设r在递增之前被解除引用/分配,并且其递增的值(也)是不可引用的.以下哪一项(如果有的话)定义明确:(a)
*a = t;,(b)++a; *a = t;,(c)*r = t;?
另请参阅后续操作:取消引用 - 分配给双倍增量的OutputIterator
我一直认为"奇异"迭代器是一个默认初始化的迭代器,它们可以作为类似的哨兵值:
typedef std::vector<Elem>::iterator I;
I start = I();
std::vector<Elem> container = foo();
for (I it = container.begin(), end = container.end(); it != end; ++it) {
if ((start == I()) && bar(it)) {
// Does something only the first time bar(it) is satisfied
// ...
start = it;
}
}
Run Code Online (Sandbox Code Playgroud)
但这个答案不仅表明我对"单数"的定义是错误的,而且我上面的比较完全是非法的.
是吗?
这段代码有什么问题?
l = [1,2,3,4,5,6]
for val in iter(l, 4):
print (val)
Run Code Online (Sandbox Code Playgroud)
它回来了
TypeError: iter(v, w): v must be callable
Run Code Online (Sandbox Code Playgroud)
为什么callable(list)返回True但可调用(l)不是?
编辑 这里应该首选哪种方法:
我一直试图将invRegex.py移植到node.js实现一段时间,但我仍然在努力解决它.由于ret.js标记器,我已经有了正则表达式解析树,并且它工作得很好,但是以一种节省内存的方式实际生成和连接所有不同的元素对我来说是非常具有挑战性的.为了简单起见,我可以说我有以下正则表达式:
[01]{1,2}@[a-f]
Run Code Online (Sandbox Code Playgroud)
提供以invRegex.py产生以下输出(标签化以占用更少的空间):
0@a 0@b 0@c 0@d 0@e 0@f
00@a 00@b 00@c 00@d 00@e 00@f
01@a 01@b 01@c 01@d 01@e 01@f
1@a 1@b 1@c 1@d 1@e 1@f
10@a 10@b 10@c 10@d 10@e 10@f
11@a 11@b 11@c 11@d 11@e 11@f
Run Code Online (Sandbox Code Playgroud)
考虑到我能够获得每个单独的令牌并生成所有有效单个输出的数组:
[01]{1,2} = function () {
return ['0', '00', '01', '1', '10', '11'];
};
@ = function () {
return ['@'];
};
[a-f] = function () {
return ['a', 'b', 'c', 'd', 'e', …Run Code Online (Sandbox Code Playgroud) 我可以显示如下目录列表:
use std::fs;
fn main() {
let paths = fs::read_dir("./").unwrap();
for path in paths {
println!("Name: {}", path.unwrap().path().display())
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在ReadDir迭代之前对迭代器进行排序吗?目录名称是类似日期的数字201610131503.我阅读了文档,ReadDir但是没有找到内置函数.也许我不知道如何搜索?
考虑以下程序:
struct list_wrapper
{
std::vector<int> m_list;
};
int main()
{
std::vector<int> myList { 1, 1, 2, 3, 5 };
const std::vector<int>::iterator iter = myList.begin();
list_wrapper wrappedList;
wrappedList.m_list = std::move(myList);
// Can I still dereference iter?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在调用之后std::move(myList),iter现在指向内部的有效项wrappedList.m_list,或者移动构造函数/赋值使所有迭代器无效?
当从C++ 11的开头迭代std::vector到第二个到最后一个元素时,首选的样式是什么?
std::vector<const char*> argv;
std::string str;
Run Code Online (Sandbox Code Playgroud)
应该使用这种更多的C++ - esque方法
for (const auto& s: decltype(argv)(argv.begin(), argv.end()-1)) {
str += std::string(s) + ' ';
}
Run Code Online (Sandbox Code Playgroud)
还是应该采用更传统的方式?
for (size_t i = 0; i < argv.size() - 1; ++i) {
str += std::string(argv[i]);
}
Run Code Online (Sandbox Code Playgroud)