标签: stdlist

如何在给定位置反转 std::list ?

例如,我试图找出如何反转,grades{1, 2, 3, 4, 5, 6}从第三个元素开始。

我知道我们无法通过列表来(grades.begin() + 2)获得该职位,但我不知道如何去做。这是我到目前为止所拥有的,我只是颠倒了整个列表:

reverse(firstList.begin(), firstList.end());
Run Code Online (Sandbox Code Playgroud)

我希望它是相反的,以便列表变成:grades{1, 2, 6, 5, 4, 3}

c++ algorithm reverse stdlist c++11

4
推荐指数
1
解决办法
341
查看次数

std :: list固定大小

如何std::list使用固定元素计数创建?

c++ stl stdlist

3
推荐指数
2
解决办法
8076
查看次数

比较两个std :: list列表并获取不同的对象

是否有准备好的功能来获得两个std::list列表的区别?

例如,我有list1: obj1, obj2, obj3, obj4list2: obj2, obj3, obj4, obj5.

该函数的结果应该是list1_unique: obj1,list1_and_list2: obj2, obj3, obj4,list2_unique: obj5.

(编写自己的实现并不难,但我更喜欢标准功能)

c++ compare stdlist

3
推荐指数
1
解决办法
3052
查看次数

std :: list thread_safety

  1. 我有一个列表,其中一个线程只是push_back和其他线程偶尔循环遍历列表并打印所有元素.在这种情况下我需要锁吗?
  2. 我有指向其他对象中的元素的指针.有安全感吗?我知道当需要更多空间时,向量将移动所有对象,因此指针将无效.

    mylist.push_back(MyObj中(1));
    if(someCond)
    {_
    myLastObj =&mylist.back();
    }

_myLastObj 是类型的 MyObj*

如果我使用了一个向量,该对象将被移动到另一个位置,指针将指向垃圾.列表是否安全?

c++ stl thread-safety stdlist

3
推荐指数
2
解决办法
7287
查看次数

迭代继承的类c ++列表

我有两个继承自第三个类的类,它们存储在一个列表中.

我正在尝试迭代该列表并调用每个类的实现函数,但是,代码不能编译.

这是我的代码:

class A
{   
   public:

   virtual void foo ()=0;
};

class B :public class A
{
   public:

   void foo();
}

class C :public class A
{
   public:

   void foo();
}

std::list<A*> listOfClasses;

listOfClasses.push_back (new B());
listOfClasses.push_back (new C());

for(std::list<A*>::iterator listIter = listOfClasses.begin(); listIter != listOfClasses.end(); listIter++)
{
    listIter->foo()
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译,我收到以下错误消息(for the line listIter->foo()):

'foo' : is not a member of 'std::_List_iterator<_Mylist>'

有什么想法吗?

c++ inheritance iterator stdlist

3
推荐指数
1
解决办法
109
查看次数

为双向链表实现begin()和end()

我编写了自己的容器类,其原始内部数据结构是std::list.然后我需要创建自己的双向链表.我现在已经实现了我自己的双向链表以及链接列表的自己的迭代器,但是我遇到了问题std::list,特别是begin()end().

根据我的理解,begin()应该指向第一个节点,并且end()应该将一个元素指向最后一个元素.我需要确保当我调用时end(),我可以减少回到有效的最后一个元素.我还需要确保我可以做正常的遍历,比如......

while (beg != end ) { do something; beg++; }
Run Code Online (Sandbox Code Playgroud)

本质上,我的链表只使用包含数据元素的节点,指向前一节点的指针和指向下一个节点的指针.

当我第一次尝试实现我的时候end(),我只有最后一个节点的下一个指针是a nullptr.它可以单独工作,但不会像stl一样工作.

关于如何实现的任何意见begin()end()标准库做同样的方式?

c++ iterator linked-list list stdlist

3
推荐指数
1
解决办法
9532
查看次数

我们可以在遍历时插入到stl列表中

我有一份我正在穿越的物品清单.在创建遍历新项目时,应将它们插入到同一列表的不同适当位置.

我用std::list它作为插入时间(有序)是log(N).

这会导致任何问题,因为我在插入容器时使用迭代器到容器中吗?请注意,插入也可能发生在当前迭代器位置旁边.

如果这不起作用,我有哪些其他选择?我们是否有这种活动的设计模式或最佳实践?

c++ stdlist

3
推荐指数
1
解决办法
72
查看次数

为什么我不能在列表迭代器上使用+ =运算符?

我有一个来自a的迭代器std::list<std::string>,但是当我尝试使用它时+=,我得到一个编译错误.

代码是:

#include <list>
#include <iostream>
#include <string>
int main() {
    std::list<std::string> x;

    x.push_front("British");
    x.push_back("character");
    x.push_front("Coding is unco");
    x.push_back("Society");
    x.push_back("City Hole");
    auto iter = x.begin();
    iter += 3;
    //std::advance(iter, 3);
    x.erase(iter);

    for (auto &e: x) {
        std::cout << e << "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用这个编译clang++ -std=c++11 -o li li.cpp,我得到:

li.cpp:13:10: error: no viable overloaded '+='
    iter += 3;
    ~~~~ ^  ~
1 error generated.
Run Code Online (Sandbox Code Playgroud)

为什么我不能使用+=这个迭代器?

c++ iterator stdlist c++11

3
推荐指数
2
解决办法
885
查看次数

我可以在 std::list 中移动元素而不会使迭代器或引用无效,但是如何?

来自cppreference 文章std::list

在列表内或跨多个列表添加、删除和移动元素不会使迭代器或引用无效。只有当相应的元素被删除时,迭代器才会失效。

事实上,排序元素时就是这种情况。来自cppreference 文章std::list::sort

该函数的不同之处还在于std::sort它不需要列表的元素类型是可交换的,保留所有迭代器的值,并执行稳定的排序。

但是如何在保留所有迭代器的值的同时任意交换两个元素的位置?

例如,假设我有一个列表:

std::list<int> l({1, 2, 3, 4});
auto it = l.begin(), jt = ++l.begin();
Run Code Online (Sandbox Code Playgroud)

现在it指向1jt指向2。我可以重新排列这个列表,使之2出现在之前1,但it仍指向1吗?

我可以:

std::swap(*it, *jt);
Run Code Online (Sandbox Code Playgroud)

但是,虽然2会在 之前1,我不会保留迭代器的值,因为显然it会指向2.

鉴于 cppreference 的前面引用,我想应该有可能实现我想要实现的目标;但是怎么样?

编辑:为了清楚起见:再举一个例子:

std::list<int> l({2, 1, 3, 4, 5});
auto it = l.begin(), jt = ++l.begin();
Run Code Online (Sandbox Code Playgroud)

现在it指向2和 …

c++ linked-list stdlist

3
推荐指数
1
解决办法
2598
查看次数

在标准容器线程上调用size()安全吗?

我有一个使用标准列表容器的缓冲区。

工人在一侧推动元素,而另一侧从另一侧弹出。这两个线程在访问容器之前都使用互斥量。

为了查看性能,我需要查询容器的大小。但是,如果不需要的话,使用互斥量查询大小似乎有点过分。

问题是,有必要吗?

文档对调用size()进行了说明(在“数据竞争”部分下: 没有包含的元素被访问:同时访问或修改它们是安全的。

c++ stl thread-safety race-condition stdlist

3
推荐指数
1
解决办法
98
查看次数