标签: stdlist

如何在列表中获得倒数第二个元素?

我有一个 std::list<double> foo;

我正在使用

if (foo.size() >= 2){
    double penultimate = *(--foo.rbegin());
}
Run Code Online (Sandbox Code Playgroud)

但这总是给我任意的价值penultimate.

我究竟做错了什么?

c++ stl stdlist

69
推荐指数
3
解决办法
2698
查看次数

如何确保迭代器不会超越end()?

我一直在使用advance一些iterators,但恐怕上述可能的越级end().我想确保我的迭代器保持在界限之间,我想到了distance但似乎它没有返回我期望的东西(迭代器超越时的非正值end()).你怎么能确保没有越级?

#include <iostream>
#include <iterator>
#include <list>
using namespace std;

int main () {
  list<int> mylist;
  for (int i=0; i<10; i++) mylist.push_back (i*10);

  list<int>::const_iterator first = mylist.begin();
  const list<int>::const_iterator last = mylist.end();

  cout << "The distance is: " << distance(first,last) << endl; // 10
  advance(first, 10);
  cout << "The distance is: " << distance(first,last) << endl; // 0
  advance(first, 1);
  cout << "The distance is: " << distance(first,last) << endl; …
Run Code Online (Sandbox Code Playgroud)

c++ iterator distance stdlist

11
推荐指数
3
解决办法
9186
查看次数

std :: list :: clear会使std :: list :: end iterator失效吗?

检查此代码:

#include "stdafx.h"
#include <list>

int _tmain(int argc, _TCHAR* argv[])
{
    std::list<int> mylist;
    mylist.push_back(1);
    std::list<int>::iterator i = mylist.end();
    if( i == mylist.end() )
        printf( "end is end\n" );

    mylist.clear();
    if( i == mylist.end() )
        printf( "never get here because Microsoft seems to "
                "think the iterator is no longer safe.\n" );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,根据cplusplus.com,这不应该是一个问题,在发布模式下,我认为这很好,并没有真正引起任何问题,但调试变得不可能,因为这只是保释而不让我继续.有什么指针吗?

c++ stl stdlist visual-studio-2012

11
推荐指数
1
解决办法
1586
查看次数

std :: list <std :: future>析构函数不会阻塞

我有一个多线程应用程序,循环等待用户输入作为主线程.在正确的输入上,它应该停止循环并等待所有其他线程,以正确结束.

为此我创建了一个std :: list,在其中我为创建线程创建了std :: future对象

std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));
Run Code Online (Sandbox Code Playgroud)

我的印象是,让列表超出范围,应该阻塞,直到所有线程都返回它们的主函数,因为列表的析构函数将会破坏所有std :: future元素,并且那些析构函数将等待,因为该线程完成.

编辑:因为它是相关的,我将在这里添加:这是在Win7上使用Visual Studio 2013 Professional / EDIT中的MSVC版本

当我尝试这个时,它没有阻止,我不得不补充

for (auto it = threads.begin(); it != threads.end(); ++it) {
    it->get();
}
Run Code Online (Sandbox Code Playgroud)

到函数结束,要正确阻止.

我是否错过了解某些内容,或者我是否必须以不同的方式创建该主题,以执行我想要执行的操作?

c++ multithreading stdlist c++11

11
推荐指数
1
解决办法
1478
查看次数

是什么让gcc std :: list排序实现如此之快?

我有一个链表实现,我正在尝试Mergesort和QuickSort算法.

我不明白为什么std :: list中的排序操作如此之快.查看linux下的std :: list,它似乎也是链表,而不是基于数组的列表.

我尝试的合并排序几乎与Dave Gamble的版本相同: 合并排序链接列表

另外,我想我会尝试一个基于此代码的简单快速排序:http://www.flipcode.com/archives/Quick_Sort_On_Linked_List.shtml

令人惊讶的是,使用std :: list和sort对1000万个随机数进行排序比其他任何一个快10倍.

对于那些提出要求的人,是的,我需要为这个项目使用我自己的列表类.

linux algorithm g++ stdlist

10
推荐指数
1
解决办法
2652
查看次数

为什么删除列表的_first_元素会使`.rend()`无效?

使用XCode 4.6在Mac OS X上测试.

此示例代码显示std::list正如我所期望的那样删除工作的最后一个元素:迭代器引用list::end()仍然是"1结束"并且仍然有效,即使删除了最后一个元素.

但第二个例子反驳了我的直觉.删除列表的第一个元素会发生变化list::rend(),我认为这是"从头开始".

我的期望是错的吗?为什么这是错的?为什么通过删除最后一个元素引用"1结束"仍然有效(如果不是?),但.rend()删除前元素后对"1(在开头()前面"的引用变为无效?

void printList( list<int>& os )
{
  for( int& i : os )
    printf( "%d ", i ) ;
  puts("");
}

void testList()
{
  list< int > os ;
  os.push_back( 1 ) ;
  os.push_back( 2 ) ;
  os.push_back( 3 ) ;
  os.push_back( 4 ) ;
  os.push_back( 5 ) ;  

  // Forward iterators:  reference to .end() not invalidated when remove last elt. …
Run Code Online (Sandbox Code Playgroud)

c++ stdlist reverse-iterator

10
推荐指数
1
解决办法
839
查看次数

在将对象添加到std :: list时,析构函数调用了对象

我有一个Foo对象,一个std :: list包含它的实例.我的问题是,当我向列表中添加一个新实例时,它首先调用ctor,然后调用dtor.然后是另一个实例上的dtor(根据this指针).

单个实例被添加到列表中,但由于调用了dtor(及其父项),因此无法按预期使用该对象.

下面是一些简化的代码来说明问题:

#include <iostream>
#include <list>

class Foo
{
public:
    Foo()
    { 
        int breakpoint = 0;
    }
    ~Foo()
    { 
        int breakpoint = 0;
    }
};

int main()
{
    std::list<Foo> li;
    li.push_back(Foo());
}
Run Code Online (Sandbox Code Playgroud)

c++ constructor stdlist

9
推荐指数
1
解决办法
3572
查看次数

list :: empty()多线程行为?

我有一个列表,希望不同的线程从中获取元素。为了避免在列表为空时锁定保护该列表的互斥锁,请empty()在锁定之前进行检查。

如果对电话的呼叫在list::empty()100%的时间内都不正确,则可以。我只想避免崩溃或中断并发list::push()list::pop()调用。

我是否可以肯定地认为VC ++和Gnu GCC有时只会empty()出错并且没有比这更糟的了?

if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes
    mutex.lock();
    if(list.empty() == false){ // check again while locked to be certain
         element = list.back();
         list.pop_back();
    }
    mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)

c++ optimization multithreading race-condition stdlist

9
推荐指数
2
解决办法
219
查看次数

将std :: list公开为只读

我有一个类,其中包含一个std :: list.我想公开这个列表,但只是以这样的方式,它包含的结构和数据是只读的,但仍然可以与迭代器一起使用.

我让它'工作'atm的方式是返回列表的副本.这使我的班级"安全",但当然没有阻止调用者修改他们的列表副本而没有获得正确的数据.

有没有更好的办法?

c++ const stdlist

8
推荐指数
2
解决办法
3564
查看次数

std :: list如何分配节点与元素

如何std::list分配保存next/ prev指针的节点及其T包含的元素?

我认为标准分配器只能用于为一种类型std::allocator::allocate分配内存(因为以递增的方式分配内存sizeof(T)).因此,似乎不可能在单个分配中分配列表节点和包含的对象,这意味着必须使用实现决定的任何方式分配节点,并且节点存储指向对象而不是对象本身的指针,这意味着两个级别的间接从指向列表节点的指针到它包含的对象,这似乎是低效的.是这样的吗?

c++ stdlist allocator

8
推荐指数
1
解决办法
910
查看次数