我有一个 std::list<double> foo;
我正在使用
if (foo.size() >= 2){
double penultimate = *(--foo.rbegin());
}
Run Code Online (Sandbox Code Playgroud)
但这总是给我任意的价值penultimate
.
我究竟做错了什么?
我一直在使用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) 检查此代码:
#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,这不应该是一个问题,在发布模式下,我认为这很好,并没有真正引起任何问题,但调试变得不可能,因为这只是保释而不让我继续.有什么指针吗?
我有一个多线程应用程序,循环等待用户输入作为主线程.在正确的输入上,它应该停止循环并等待所有其他线程,以正确结束.
为此我创建了一个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)
到函数结束,要正确阻止.
我是否错过了解某些内容,或者我是否必须以不同的方式创建该主题,以执行我想要执行的操作?
我有一个链表实现,我正在尝试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倍.
对于那些提出要求的人,是的,我需要为这个项目使用我自己的列表类.
使用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) 我有一个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) 我有一个列表,希望不同的线程从中获取元素。为了避免在列表为空时锁定保护该列表的互斥锁,请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) 我有一个类,其中包含一个std :: list.我想公开这个列表,但只是以这样的方式,它包含的结构和数据是只读的,但仍然可以与迭代器一起使用.
我让它'工作'atm的方式是返回列表的副本.这使我的班级"安全",但当然没有阻止调用者修改他们的列表副本而没有获得正确的数据.
有没有更好的办法?
如何std::list
分配保存next
/ prev
指针的节点及其T
包含的元素?
我认为标准分配器只能用于为一种类型std::allocator::allocate
分配内存(因为以递增的方式分配内存sizeof(T)
).因此,似乎不可能在单个分配中分配列表节点和包含的对象,这意味着必须使用实现决定的任何方式分配节点,并且节点存储指向对象而不是对象本身的指针,这意味着两个级别的间接从指向列表节点的指针到它包含的对象,这似乎是低效的.是这样的吗?