在Python中,将逗号显示为以逗号分隔的列表非常容易:
>>> iterable = ["a", "b", "c"]
>>> ", ".join(iterable)
'a, b, c'
Run Code Online (Sandbox Code Playgroud)
是否有一种接近这种简洁的Java方式?(注意最后没有",".)
我正在写一份MR Job.但我遇到了与Iterable对象相关的问题.我需要找到它的大小.我把它浇铸为List对象,但这是错误的.(名单可强制转换为可迭代,但不能做的逆转.)还有另外一种方法,通过使用该对象的迭代和递增每个值的计数器IE浏览器.但这不是最佳解决方案.任何人都可以提出更好的方法吗?
请帮我.提前致谢.
这是詹姆斯对这个问题的答案的一个(另一个)跟进:扁平化迭代器
如何更改flattenig_iterator以使其递归工作?假设我有更多级别的嵌套容器,我不希望被限制在给定的嵌套深度.即flattening_iterator应该使用
std::vector< std::vector < std::vector < int > > >
Run Code Online (Sandbox Code Playgroud)
以及
std::vector< std::vector < std::vector < std::vector < int > > > >
Run Code Online (Sandbox Code Playgroud)
在我的实际代码中,我有一个对象数组,它们本身可能包含或不包含这样的数组.
编辑:
在使用不同方式迭代不同类型的嵌套容器后,我学会了一些其他人可能感兴趣的东西:
使用嵌套循环访问容器元素比使用迭代器解决方案快5到6倍.
优点:
缺点:
其他利弊?
我有一个这样的列表列表:
std::list<std::list<double> > list;
Run Code Online (Sandbox Code Playgroud)
我在其中填充了一些带有双打的列表(实际上非常多,这就是为什么我没有使用向量.所有这些复制都需要花费很多时间.)
假设我想访问可以加入的元素,list[3][3]如果列表不是列表而是矢量或二维数组.我该怎么办?
我知道访问列表中的元素是通过使用迭代器完成的.我无法弄清楚如何摆脱双重.
void replace(vector<string> my_vector_2, string old, string replacement){
vector<string>::iterator it;
for (it = my_vector_2.begin(); it != my_vector_2.end(); ++it){
if (*it==old){
my_vector_2.erase(it);
my_vector_2.insert(it,replacement);
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我希望这个函数用字符串替换替换向量中所有出现的字符串old.但是在调用此函数时,根本不会更改向量.我不确定我是否正确使用擦除和插入功能.有任何想法吗?
我目前正在学习STL,我对find和const迭代器有一些不确定性.假设我有一个find函数:
some_stl_container::const_iterator found = myContainer.find(value);
Run Code Online (Sandbox Code Playgroud)
在那之后,我应该检查我得到的found另一个const_iterator,或者只是对一个迭代器进行检查是有效的.基本上这样做会有任何区别:
if(found!=myContainer.cend())
Run Code Online (Sandbox Code Playgroud)
还有这个:
if(found!=myContainer.end())
Run Code Online (Sandbox Code Playgroud)
第一个看起来更准确(至少对我而言),但第二个应该也能正常工作,对吗?
cppreference说vector<bool>专门化的迭代器是实现定义的,许多不支持特征ForwardIterator(因此RandomAccessIterator).
cplusplus增加了一个神秘的"最":
容器使用的指针和迭代器类型不一定既不是指针也不是符合迭代器,尽管它们应模拟大多数预期的行为.
我无法访问官方规范.迭代器是否保证了任何迭代器行为vector<bool>?
更具体地说,如何编写符合标准的代码以在项目的中间插入项目vector<bool>?以下是我尝试过的几个编译器的工作原理:
std::vector<bool> v(4);
int k = 2;
v.insert(v.begin() + k, true);
Run Code Online (Sandbox Code Playgroud)
会永远吗?
我是Rust的新手,我正在努力学习迭代器.我正在研究的具体问题是产生三角形数字的迭代器(三角形数字为1,3,6,10,15,其中1 = 1,3 = 1 + 2,6 = 1 + 2 + 3等).我有这个创建的基础知识,如下所示:
pub struct Triangle {
cur: u32,
n: u32,
m: u32,
}
impl Iterator for Triangle {
type Item = u32;
fn next(&mut self) -> Option<u32> {
if self.n == self.m {
return None;
}
self.n = self.n + 1;
self.cur = self.cur + self.n;
Some(self.cur)
}
}
Run Code Online (Sandbox Code Playgroud)
一个快速可运行的例子是
let t = Triangle { cur: 0, n: 0, m: 10 };
let s: u32 = t.sum();
println!("{}", s); …Run Code Online (Sandbox Code Playgroud) 我最初尝试generator在编写用于训练Keras模型的自定义生成器时使用语法.所以我yield编辑__next__.但是,当我尝试训练我的模式时,model.fit_generator我会得到一个错误,我的生成器不是迭代器.的修复是改变yield到return其中还必要rejiggering的逻辑__next__以跟踪状态.与让yield我为我工作相比,这相当麻烦.
有没有办法可以让这个工作yield?如果我必须使用return语句,我将需要编写几个迭代器,这些迭代器必须具有非常笨重的逻辑.
在试图解决一个问题,我开始思考这个-给予user-defined class和2 comparators吧,让我们说我们有2套std::set<user_class,comparator_inc>,并std::set<user_class,comparator_dec>在comparators排序上的一个值增减值user_class(一个简单的int也许).这是我的代码:
#include <iostream>
#include <set>
using std::cout;
using std::endl;
using std::set;
struct A
{
int val;
};
struct c_inc
{
bool operator()(const A& first,const A& second) const
{
return first.val > second.val;
}
};
struct c_dec
{
bool operator()(const A& first,const A& second) const
{
return first.val < second.val;
}
};
int main()
{
set<A,c_inc> s1;
set<A,c_dec> s2;
auto x = s1.insert({1});
cout << x.first->val …Run Code Online (Sandbox Code Playgroud)