Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;rbegin修改反向迭代器的地址 我在C++中遇到了一个奇怪的问题: mutex_type list_mutex; typedef list<char*> RQueue; RQueue rQueue; RQueue::reverse_iterator rstart, rend, last; 1 while(true) { 2 LockMutex(list_mutex); 3 rstart = rQueue.rbegin(); 4 rend = rQueue.rend(); 5 while( (rstart != rend) && (rstart != last) ) { 6 print *rstart; 7 } 8 last = rQueue.rbegin(); 9 UnlockMutex(list_mutex); 10 } mutex\u类型列表\u mutex; typedef列表队列; RQueue RQueue; RQueue::reverse_迭代器rstart、rend、last; 1 while(正确){ 2个锁互斥(列表互斥); 3 rstart=rQueue.rbegin(); 4 rend=rQueue.rend(); 5 while((rstart!=rend)和&(rstart!=last)){ 6打印*rstart; 7 } 8 last=rQueue.rbegin(); 9解锁互斥锁(列出互斥锁); 10 } rQueue是我按相反顺序迭代的队列 rQueue可以随时接收消息 我添加了迭代器last,以便 避免使用第6行的接收消息进行返工_C++_Reverse Iterator - Fatal编程技术网

C++;rbegin修改反向迭代器的地址 我在C++中遇到了一个奇怪的问题: mutex_type list_mutex; typedef list<char*> RQueue; RQueue rQueue; RQueue::reverse_iterator rstart, rend, last; 1 while(true) { 2 LockMutex(list_mutex); 3 rstart = rQueue.rbegin(); 4 rend = rQueue.rend(); 5 while( (rstart != rend) && (rstart != last) ) { 6 print *rstart; 7 } 8 last = rQueue.rbegin(); 9 UnlockMutex(list_mutex); 10 } mutex\u类型列表\u mutex; typedef列表队列; RQueue RQueue; RQueue::reverse_迭代器rstart、rend、last; 1 while(正确){ 2个锁互斥(列表互斥); 3 rstart=rQueue.rbegin(); 4 rend=rQueue.rend(); 5 while((rstart!=rend)和&(rstart!=last)){ 6打印*rstart; 7 } 8 last=rQueue.rbegin(); 9解锁互斥锁(列出互斥锁); 10 } rQueue是我按相反顺序迭代的队列 rQueue可以随时接收消息 我添加了迭代器last,以便 避免使用第6行的接收消息进行返工

C++;rbegin修改反向迭代器的地址 我在C++中遇到了一个奇怪的问题: mutex_type list_mutex; typedef list<char*> RQueue; RQueue rQueue; RQueue::reverse_iterator rstart, rend, last; 1 while(true) { 2 LockMutex(list_mutex); 3 rstart = rQueue.rbegin(); 4 rend = rQueue.rend(); 5 while( (rstart != rend) && (rstart != last) ) { 6 print *rstart; 7 } 8 last = rQueue.rbegin(); 9 UnlockMutex(list_mutex); 10 } mutex\u类型列表\u mutex; typedef列表队列; RQueue RQueue; RQueue::reverse_迭代器rstart、rend、last; 1 while(正确){ 2个锁互斥(列表互斥); 3 rstart=rQueue.rbegin(); 4 rend=rQueue.rend(); 5 while((rstart!=rend)和&(rstart!=last)){ 6打印*rstart; 7 } 8 last=rQueue.rbegin(); 9解锁互斥锁(列出互斥锁); 10 } rQueue是我按相反顺序迭代的队列 rQueue可以随时接收消息 我添加了迭代器last,以便 避免使用第6行的接收消息进行返工,c++,reverse-iterator,C++,Reverse Iterator,在第8行,我保留了打印消息的位置,我希望 仅打印比上一条消息更新的消息 我的问题是:当迭代完成并添加新消息时 队列中,迭代器last的值被更改,变得相同 作为迭代器的值,因此新的 消息不会打印在第6行 我不知道为什么last=rQueue.rbegin()在解锁队列后接收新元素时修改其值 谢谢。如果将迭代器设置为rbegin(),它将始终指向列表的最后一个元素。如果在后面添加另一个元素,迭代器将仍然指向最后一个元素(现在是新元素)。它不会改变,只是一直指向终点 我做了这个测试: list<

在第8行,我保留了打印消息的位置,我希望 仅打印比上一条消息更新的消息

我的问题是:当迭代完成并添加新消息时 队列中,迭代器
last
的值被更改,变得相同 作为迭代器的值,因此新的 消息不会打印在第6行

我不知道为什么
last=rQueue.rbegin()
在解锁队列后接收新元素时修改其值


谢谢。

如果将迭代器设置为
rbegin()
,它将始终指向列表的最后一个元素。如果在后面添加另一个元素,迭代器将仍然指向最后一个元素(现在是新元素)。它不会改变,只是一直指向终点

我做了这个测试:

list<const char *> my_list;
my_list.push_back("msg 1");

list<const char*>::reverse_iterator it = my_list.rbegin();

cout << "Iterator is " << *it << endl;

my_list.push_back("msg 2");
my_list.push_back("msg 3");
my_list.push_back("msg 4");

cout << "Iterator is " << *it << endl;
我有另一个解决方案,您可以使用它,它不使用反向迭代器。相反,
addMessage()
-函数将
read\u pos
更新为最新消息。如果
read\u pos
未指向末尾,则也不会更改。这允许
printMessage()
打印自上次运行以来添加的所有消息

请注意,我只测试了这个,没有锁定

mutex_type  list_mutex;
typedef list<const char*> RQueue;
RQueue rQueue;

RQueue::iterator read_pos;

void addMessage(const char *message) {
    LockMutex(list_mutex);

    rQueue.push_back(message);

    if (rQueue.size() == 1) {
        read_pos = rQueue.begin();
    }
    else if (read_pos == rQueue.end()) {
        read_pos--;
    }

    UnlockMutex(list_mutex);
}

void printMessage() {
  RQueue::iterator prev_pos;

  while (true) {
    LockMutex(list_mutex);

    if (rQueue.size() == 0) {
          UnlockMutex(list_mutex);
          continue;
    }

    RQueue::iterator end = rQueue.end();
    while (read_pos != end) {
        cout << *read_pos << endl;
        read_pos++;
    }

    UnlockMutex(list_mutex);
  }
}
mutex\u类型列表\u mutex;
typedef列表队列;
RQueue RQueue;
RQueue::迭代器读取位置;
void addMessage(常量字符*消息){
锁互斥(列表互斥);
rQueue.push_back(消息);
if(rQueue.size()==1){
read_pos=rQueue.begin();
}
else if(read_pos==rQueue.end()){
读_pos--;
}
解锁互斥锁(列出互斥锁);
}
void printMessage(){
RQueue::迭代器prev_pos;
while(true){
锁互斥(列表互斥);
if(rQueue.size()==0){
解锁互斥锁(列出互斥锁);
继续;
}
RQueue::迭代器end=RQueue.end();
while(读取位置!=结束){

cout如果您将迭代器设置为
rbegin()
,它将始终指向列表的最后一个元素。如果您在后面添加另一个元素,迭代器将仍然指向最后一个元素(现在是新的元素)。它不会更改,只是一直指向末尾

我做了这个测试:

list<const char *> my_list;
my_list.push_back("msg 1");

list<const char*>::reverse_iterator it = my_list.rbegin();

cout << "Iterator is " << *it << endl;

my_list.push_back("msg 2");
my_list.push_back("msg 3");
my_list.push_back("msg 4");

cout << "Iterator is " << *it << endl;
我有另一个解决方案,您可以使用它,它不使用反向迭代器。相反,
addMessage()
-函数将
read\u pos
更新为最新的消息。如果
read\u pos
没有指向末尾,它也不会更改。这允许
printMessage()
打印自上次运行以来添加的所有消息

请注意,我只测试了这个,没有锁定

mutex_type  list_mutex;
typedef list<const char*> RQueue;
RQueue rQueue;

RQueue::iterator read_pos;

void addMessage(const char *message) {
    LockMutex(list_mutex);

    rQueue.push_back(message);

    if (rQueue.size() == 1) {
        read_pos = rQueue.begin();
    }
    else if (read_pos == rQueue.end()) {
        read_pos--;
    }

    UnlockMutex(list_mutex);
}

void printMessage() {
  RQueue::iterator prev_pos;

  while (true) {
    LockMutex(list_mutex);

    if (rQueue.size() == 0) {
          UnlockMutex(list_mutex);
          continue;
    }

    RQueue::iterator end = rQueue.end();
    while (read_pos != end) {
        cout << *read_pos << endl;
        read_pos++;
    }

    UnlockMutex(list_mutex);
  }
}
mutex\u类型列表\u mutex;
typedef列表队列;
RQueue RQueue;
RQueue::迭代器读取位置;
void addMessage(常量字符*消息){
锁互斥(列表互斥);
rQueue.push_back(消息);
if(rQueue.size()==1){
read_pos=rQueue.begin();
}
else if(read_pos==rQueue.end()){
读_pos--;
}
解锁互斥锁(列出互斥锁);
}
void printMessage(){
RQueue::迭代器prev_pos;
while(true){
锁互斥(列表互斥);
if(rQueue.size()==0){
解锁互斥锁(列出互斥锁);
继续;
}
RQueue::迭代器end=RQueue.end();
while(读取位置!=结束){

虽然不是真的重复,但我在那里的答案回答了你这里的问题。如果你去掉三分之二的括号,
while
语句的意思并不完全相同。虽然不是真的重复,但我在那里的答案回答了你这里的问题。不是说
while
语句会回答我如果你去掉三分之二的括号,情况也是一样的。