由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教一个C++ 的 iterator 问题。
相关主题
一个C++的概念问题请教一个boost::bind的问题
呼唤大侠们,我实在不能实现C++泛型的精神。how to read a sentence into a vector of string?
C++ vector 一边遍历一边删[请教]iterator and reference in C++ vector
帮忙看一个codeC++ optimization question
[合集] 如何同时sort 2个vector ?C++: What is the difference between the two approaches?
[合集] java怎么这么怪呀?C++ 里面这个 & 是什么意思?
yield和goroutine啥区别?C++11里list迭代器判空仍然知道具体的list对象吗?
C++如何快速输入iterator类型名C++请教,使用c++ vector iterator后输出vector数据出错
相关话题的讨论汇总
话题: stream话题: cur话题: int话题: vector话题: getvalue
进入Programming版参与讨论
1 (共1页)
d******e
发帖数: 152
1
请教一个C++ 的 iterator 问题。
假设有多个 streams, 找到那些至少有k 个stream 有的数。
我设了个Stream 类, 但是那个 bool move() 有问题,
iterator 到了尾部后, it != nums.end() 还是 true;
给的例子应该输出 3, 然后停止,但是运行却不是想象的。
谢谢。
#include
#include
#include
using namespace std;
class Stream{
private:
vector nums;

public:
vector::iterator it;
Stream(vector v): nums(v) {
it = nums.begin();
}
bool move(){
return it != nums.end();
}
int getValue(){
++it;
return *it;
}
};
class Comp{
public:
bool operator()(Stream& s1, Stream& s2){
return *(s1.it) > *(s2.it);
}
};
class Merge_stream{
private:
priority_queue, Comp> pq;
public:
vector find_nums(vector streams, int k){
vector res;
if (streams.size() == 0) return res;
for (int i = 0; i < streams.size(); ++i){
if (streams[i].move())
pq.push(streams[i]);
}
while (!pq.empty()){
Stream cur_s = pq.top();
pq.pop();
int cur_val = *(cur_s.it);
int count = 1;
while (cur_s.move() && cur_s.getValue() == cur_val);
if (cur_s.move())
pq.push(cur_s);

// deal with other streams with the same vals
while (!pq.empty() && cur_val == *(pq.top().it)){
++count;
Stream cur_top = pq.top();
pq.pop();
while (cur_top.move() && cur_top.getValue() == cur_val);
if (cur_top.move())
pq.push(cur_top);
}
if (count >= k)
res.push_back(cur_val);
}
return res;
}
};
int main(){
vector v1 = {1, 2, 2, 3};
vector v2 = {0, 1, 3};
vector v3 = {0, 2, 3};
Stream s1(v1);
Stream s2(v2);
int a = -1;
for (int i = 0; i < 4; ++i){
if (s2.move())
a = s2.getValue();
}
Stream s3(v3);
vector s = {s1, s2, s3};
Merge_stream m;
vector res;
res = m.find_nums(s, 3);

return 0;
}
p***o
发帖数: 1252
2
getValue有UB, 编译的时候把调试选项打开-D_GLIBCXX_DEBUG

【在 d******e 的大作中提到】
: 请教一个C++ 的 iterator 问题。
: 假设有多个 streams, 找到那些至少有k 个stream 有的数。
: 我设了个Stream 类, 但是那个 bool move() 有问题,
: iterator 到了尾部后, it != nums.end() 还是 true;
: 给的例子应该输出 3, 然后停止,但是运行却不是想象的。
: 谢谢。
: #include
: #include
: #include
: using namespace std;

t**********e
发帖数: 134
3
When the iterator points to the last element in vector, not vector.end() in
move, the move() function returns true; then in getValue(), iterator points
to vector.end() after ++iterator, then getValue() will try to return vector.
end().

【在 d******e 的大作中提到】
: 请教一个C++ 的 iterator 问题。
: 假设有多个 streams, 找到那些至少有k 个stream 有的数。
: 我设了个Stream 类, 但是那个 bool move() 有问题,
: iterator 到了尾部后, it != nums.end() 还是 true;
: 给的例子应该输出 3, 然后停止,但是运行却不是想象的。
: 谢谢。
: #include
: #include
: #include
: using namespace std;

m*****o
发帖数: 110
4
int getValue(){
return *it++;
}
d******e
发帖数: 152
5
Thank you very much.

in
points
vector.

【在 t**********e 的大作中提到】
: When the iterator points to the last element in vector, not vector.end() in
: move, the move() function returns true; then in getValue(), iterator points
: to vector.end() after ++iterator, then getValue() will try to return vector.
: end().

1 (共1页)
进入Programming版参与讨论
相关主题
video streaming programming[合集] 如何同时sort 2个vector ?
C++读文件[合集] java怎么这么怪呀?
哪些language有处理视频的包?yield和goroutine啥区别?
Java Streams vs C# LINQ vs Java6C++如何快速输入iterator类型名
一个C++的概念问题请教一个boost::bind的问题
呼唤大侠们,我实在不能实现C++泛型的精神。how to read a sentence into a vector of string?
C++ vector 一边遍历一边删[请教]iterator and reference in C++ vector
帮忙看一个codeC++ optimization question
相关话题的讨论汇总
话题: stream话题: cur话题: int话题: vector话题: getvalue