我有一个这样的清单
l=[1,1,1,1,2,2,2,3,3,3,3,3,3,4,4,5,6,6,6,5,5,5,7,7,8,8,8,8,8,9,9,9,10,10]
Run Code Online (Sandbox Code Playgroud)
现在我只想连续选择一个重复值,所以输出应该是这样的,
l=[1,2,3,4,5,6,5,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)
我可以使用 for 循环检查下一个值和前一个值并附加到列表中,但在这种情况下执行时间很长,寻找最有效的快捷方式。
我正在尝试实现一个简单的 ostream_itreator,它流式传输每个第 N 个元素,但我收到一个类型错误
error: no type named ‘value_type’ in ‘struct std::iterator_traits<outIterator<int> >’
typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
Run Code Online (Sandbox Code Playgroud)
代码:
#include <iostream>
#include <vector>
#include <iterator>
template<class T>
class outIterator {
std::ostream *stream;
size_t N;
const char* delim;
size_t counter = 0;
public:
// initialization
outIterator(std::ostream& out)
: stream(&out)
, N(1)
, delim(" ")
{}
outIterator(std::ostream& out, size_t N, const char* delimiter)
: stream(&out)
, N(N)
, delim(delimiter)
{}
// =
outIterator<T>& operator= (const T& value) {
if (counter % N == …Run Code Online (Sandbox Code Playgroud) 我有一个iteratorinside thread,我正在尝试删除重复的记录。
Runnable readingThread = new Runnable() {
@Override
public void run() {
Iterator<Demand> iterator = null;
for (iterator = demandListFromFile.iterator(); iterator.hasNext();) {
Demand demand = iterator.next();
/**
* Find and assign the Item ID
*/
if (itemListHashMap.containsValue(demand.getItem().getItemName())) {
demand.getItem().setIditem(itemListHashMapReversed.get(demand.getItem().getItemName()));
} else {
unavailableItemsList.add(demand.getItem().getItemName());
}
/**
* Find and remove duplicate records
*/
for (Map.Entry<Date, String> entry : demandListHashMap.entries()) {
if (demand.getDueDate().equals(entry.getKey()) && demand.getItem().getItemName().equals(entry.getValue())) {
iterator.remove();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
删除几个项目后,iterator.remove抛出以下异常
Exception in thread "Thread-0" …Run Code Online (Sandbox Code Playgroud) 我一直在尝试编写一个程序,在该程序中我为学生班级输入数据(使用(const string &first_name, const string &last_name, float gpa, int id),该程序可以显示哪些学生的 gpa 高于 1.00。我在迭代时遇到问题通过一个向量。这是给我带来麻烦的函数:
vector<Student> find_failing_students(vector<Student> &students) {
vector<Student> failing_students;
int endVar;
vector<Student>::iterator it;
std::vector<Student>::iterator &forwardmarch = &students.begin();
while(forwardmarch != &students.end())
{
Student temp = Student(forwardmarch->first_, forwardmarch->last_, forwardmarch->gpa_, forwardmarch->id_);
if(temp.getgpa(temp) < 1) {
failing_students.push_back(temp);
forwardmarch++;
}
Run Code Online (Sandbox Code Playgroud)
该std::vector<Student>::iterator &forwardmarch = &students.begin();部分给了我以下错误:来自类型为 'std::vector::迭代器*' {又名'__gnu_cxx::__normal_iterator >*'}
while 循环while(forwardmarch != &students.end())还给了我以下错误: 'operator!=' 不匹配(操作数类型是 'std::vector::iterator' {aka '__gnu_cxx::__normal_iterator >'} 和 'std::vector::iterator *' {aka '__gnu_cxx::__normal_iterator >*'})
我尝试了很多东西,也尝试过使用更典型的 for 循环,比如
for(std::vector<T>::iterator it = v.begin(); it …Run Code Online (Sandbox Code Playgroud) 我想列出连接字符串列表的所有可能方法,例如:
输入:
strings = ['hat','bag','cab']
Run Code Online (Sandbox Code Playgroud)
输出:
concatenated = ['hatbag','hatcab','hatbagcab','hatcabbag','baghat','bagcab',
'baghatcab','bagcabhat','cabhat','cabbag','cabhatbag','cabbaghat']
Run Code Online (Sandbox Code Playgroud)
我已经尝试对这个简单的 3 字符串列表使用 for 循环,但我不知道如何使用列表中的许多字符串来执行此操作。
有人可以帮忙吗?
在所有类型的迭代器中,为什么没有支持stack,queue和priority_queueSTL 容器的模式?
#include <iostream>
#include <stack>
#include <algorithm>
int main(){
std::stack<int> values;
std::stack<int> valuesCopy;
values.push(98);
values.push(11);
values.push(14);
values.push(17);
values.push(20);
std::for_each( /* How can i manage this in a alternative way */,
[&](int value) mutable throw() -> void{ /* Process */ ;} );
std::copy(/* Same for this */,std::back_inserter(valuesCopy));
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一个用例,我需要重复一些代码块:
我想知道,是否有一些 Python 内置方法可以:
while循环的方式重复for循环的方式重复注意:我知道我可以使用if语句(取决于是否存在上限),并在 afor或whileloop之间切换。我试图不让代码块重复两次,或者它分解为另一个函数。
当前实施
我使用 Python 3.8.2编写了以下有缺陷的(见下文)for_while_hybrid.py。
from typing import Iterator
def iter_for_while(num_yield: int = None) -> Iterator[int]:
"""Generate an incrementing counter.
This enables one to make a for loop or a while loop, depending on args.
Args:
num_yield: Number of times to yield.
If left as None, the generator makes a while loop
If …Run Code Online (Sandbox Code Playgroud) 我正在编写一行非常简单的代码来显示地图容器的内容,但遇到了一个有趣的错误。如果我写:
void DisplayMap(const map<int, string>& myMap)
{
for (const map<int, string>::const_iterator myIterator = myMap.begin();
myIterator != myMap.end(); ++myIterator)
{
cout << myIterator->first << ": " << myIterator->second << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器反对我使用++myIterator,声称该函数没有“++”类型的重载运算符。但是,如果我将其设为模板:
template <typename T>
void DisplayMap(const T& myMap)
{
for (map<int, string>::const_iterator myIterator = myMap.begin(); myIterator != myMap.end(); ++myIterator)
{
cout << myIterator->first << ": " << myIterator->second << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
那么就没有问题了。代码运行完美。我希望有人能解释为什么编译器在这里没有问题。据我了解,使函数成为模板类似于为变量类型调用 auto 。但是编译器到底在做什么呢?
谢谢你的时间。
标准是否保证
--list.begin() == list.end()
总是成立并且它实际上是一个有效的操作?(list是 的一个实例std::list)。
至少 MSVC 2019 似乎就是这种情况。
例如,这在以下情况下会很有用:
for ( auto i = list.begin(); i != list.end(); ++i )
{
...
list.erase(i--);
...
}
Run Code Online (Sandbox Code Playgroud)
,即在迭代时删除元素时,因为i可能是列表的开头。这也需要++list.end() == list.begin()持有;那个怎么样?
iterator ×10
c++ ×6
python ×3
for-loop ×2
list ×2
stl ×2
c++-concepts ×1
c++11 ×1
c++20 ×1
containers ×1
increment ×1
iteration ×1
java ×1
loops ×1
stdlist ×1
type-traits ×1
vector ×1
while-loop ×1