我正在使用一个返回生成器的库。有没有办法在不使用多个next()语句的情况下从特定迭代开始?
在一个简单的 for 循环中,我可以执行以下操作。
array = [2, 5, 1, 4, 3]
for i in array [2:]:
# do something
Run Code Online (Sandbox Code Playgroud)
在发电机中,我不能做如上所示。相反,我必须使用多个next ()语句从第三个索引开始。尝试执行与 for 循环相同的操作时,我收到一条错误消息,指出“生成器不可编写脚本”。
我正在读这本书:Data Structures and Algorithm Analysis in Java by Mark Weiss。有人可以解释一下使用迭代器如何在调用get(i)?
书中的文字片段:
我只是在遵循迭代器模式,你能告诉我S.Iterator.Element下面的代码是什么意思 Int where Turn == S.Iterator.Element吗?
func computeScoreIncrement<S : Sequence>(_ pastTurnsReversed: S) -> Int where Turn == S.Iterator.Element {
var scoreIncrement: Int?
for turn in pastTurnsReversed {
if scoreIncrement == nil {
scoreIncrement = turn.matched! ? 1 : -1
break
}
}
//Turn is class name & nextScorer is protocol instance.
return (scoreIncrement ?? 0) + (nextScorer?.computeScoreIncrement(pastTurnsReversed) ?? 0)
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 yield return 来处理一些数据,其中包含一组不确定的迭代。我想开始处理,但是一旦满足条件(例如字节大小)就从循环中断,将枚举数传递给将继续处理的新线程,然后返回到目前为止处理的结果。
实际上,我有一个 foreach 循环,我可能会在结束之前突破它。如何将 IEnumerable 传递给一个新线程并从我离开的地方而不是从头开始“继续”?
public static IEnumerable<String> Process()
{
// static values added for simplicity, but will be a variable number of returns
yield return "1";
yield return "2";
yield return "3";
yield return "4";
yield return "5";
yield return "6";
}
List<String> main()
{
List<String> retVal = new List<String>();
IEnumerable<String> strList = Process();
foreach(String strItem in strList)
{
retVal.Add(strItem);
Console.WriteLine(strItem);
// Time to send something back and continue in a new thread
if (strItem.Equals("3")) …Run Code Online (Sandbox Code Playgroud) 我正在尝试用随机数初始化一个双向量数组(确实是一个矩阵),但我一定有什么问题,而且我无法在这里或在谷歌中找到解决方案。
我有下一个“标准”定义,它用 0 初始化我的矩阵:
情况1:
int num_rows=5, num_cols=7;
std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, 0));
Run Code Online (Sandbox Code Playgroud)
所以如果我做这样的事情:
案例二
std::vector<std::vector<int>> Matrix(num_rows, std::vector<int>(num_cols, rand()%100));
Run Code Online (Sandbox Code Playgroud)
我看到的是它rand()%100被调用一次,所以如果它返回,34那么我的所有矩阵都将填充该数字。
在这一点上,我尝试使用Case 1初始化和 double for 迭代器:
for ( std::vector<std::vector<int>>::iterator it1 = Matrix.begin(); it1 != Matrix.end(); ++it1 )
{
for ( std::vector<int>::iterator it2 = (*it1).begin(); it2 != (*it1).end(); ++ it2 )
{
std::cout << (*it2) << "\n"; //With that I can see every value on the matrix... right now all 0
}
}
Run Code Online (Sandbox Code Playgroud)
现在在那个循环中,我找不到逐项执行并为它们分配新值的方法。我很抱歉,因为我有良心,这是一个非常简单的问题,但在谷歌上找不到......
由于 it2 是我必须使用的 …
我有两个清单:
list1=[1,2,3]
list2=[4,5,6,7]
Run Code Online (Sandbox Code Playgroud)
我想迭代它们。我想获得的是类似的东西:
1,4
2,5
3,6
,7
Run Code Online (Sandbox Code Playgroud)
我曾想过使用该zip函数,但它似乎不适用于不同长度的列表,如使用以下代码:
for l1, l2 in list1, list2:
print(l1,l2)
Run Code Online (Sandbox Code Playgroud)
我明白了:
1,4
2,5
3,6
Run Code Online (Sandbox Code Playgroud)
所以数字 7 不见了。我想知道如何调整代码,或者当列表的长度不同时,我是否缺少任何其他选项来并行迭代?
考虑以下片段:
MapT map;
map["A"] = 1;
map["B"] = 2;
map["C"] = 3;
map["D"] = 4;
map["E"] = 5;
MapT mapSecond;
mapSecond["A"] = 10;
mapSecond["B"] = 20;
mapSecond["C"] = 30;
mapSecond["X"] = 4;
mapSecond["Y"] = 5;
MapT::const_iterator itSecond = mapSecond.begin();
MapT::iterator it = map.begin();
for (; itSecond != mapSecond.end(); ++itSecond)
{
std::pair<MapT::iterator, bool> pair = map.insert(std::make_pair(itSecond->first, itSecond->second));
if (!pair.second)
{
pair.first->second = itSecond->second;
}
}
for (; it != map.end(); ++it)
{
std::cout << it->first << " " << it->second << …Run Code Online (Sandbox Code Playgroud) 我想从字符串中 char 的第一次出现到字符串末尾获取一个子字符串。我以为我可以只使用构造函数,就像在这个问题中一样,但它并没有真正起作用。当我这样做时:
string(input.find(' ')+1, input.end()-1)
Run Code Online (Sandbox Code Playgroud)
我面临“无构造函数”错误
error: no matching constructor for initialization of 'std::__cxx11::string' (aka 'basic_string<char>')
Run Code Online (Sandbox Code Playgroud)
如何解决此问题并使我的代码正常工作?
我正在尝试创建一个程序来计算一个字母在字符串中的次数,但是下面的程序没有输出任何内容,尽管该函数count()确实被调用了。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int count(const string &s, char c) {
string::const_iterator i = find(s.begin(), s.end(), c);
int n = 0;
while (i != s.end()) {
++n;
i = find(i+1, s.end(), c);
}
return n;
}
int main() {
const string e = "dddddddd";
char d = 'd';
count(e, d);
}
Run Code Online (Sandbox Code Playgroud) i = 0
while i < 10 do
i += 1
end
Run Code Online (Sandbox Code Playgroud)
有没有办法让它发出值 [1..10]?
例如:
ary = while (i < 10).map do
Run Code Online (Sandbox Code Playgroud)