例如,我试图找出如何反转,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}
是否有准备好的功能来获得两个std::list
列表的区别?
例如,我有list1: obj1, obj2, obj3, obj4
和list2: obj2, obj3, obj4, obj5
.
该函数的结果应该是list1_unique: obj1
,list1_and_list2: obj2, obj3, obj4
,list2_unique: obj5
.
(编写自己的实现并不难,但我更喜欢标准功能)
我有指向其他对象中的元素的指针.有安全感吗?我知道当需要更多空间时,向量将移动所有对象,因此指针将无效.
mylist.push_back(MyObj中(1));
if(someCond)
{_
myLastObj =&mylist.back();
}
_myLastObj
是类型的 MyObj*
如果我使用了一个向量,该对象将被移动到另一个位置,指针将指向垃圾.列表是否安全?
我有两个继承自第三个类的类,它们存储在一个列表中.
我正在尝试迭代该列表并调用每个类的实现函数,但是,代码不能编译.
这是我的代码:
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>'
有什么想法吗?
我编写了自己的容器类,其原始内部数据结构是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()
标准库做同样的方式?
我有一份我正在穿越的物品清单.在创建遍历新项目时,应将它们插入到同一列表的不同适当位置.
我用std::list
它作为插入时间(有序)是log(N)
.
这会导致任何问题,因为我在插入容器时使用迭代器到容器中吗?请注意,插入也可能发生在当前迭代器位置旁边.
如果这不起作用,我有哪些其他选择?我们是否有这种活动的设计模式或最佳实践?
我有一个来自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)
为什么我不能使用+=
这个迭代器?
在列表内或跨多个列表添加、删除和移动元素不会使迭代器或引用无效。只有当相应的元素被删除时,迭代器才会失效。
事实上,排序元素时就是这种情况。来自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
指向1
和jt
指向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
和 …
我有一个使用标准列表容器的缓冲区。
工人在一侧推动元素,而另一侧从另一侧弹出。这两个线程在访问容器之前都使用互斥量。
为了查看性能,我需要查询容器的大小。但是,如果不需要的话,使用互斥量查询大小似乎有点过分。
问题是,有必要吗?
文档对调用size()进行了说明(在“数据竞争”部分下: 没有包含的元素被访问:同时访问或修改它们是安全的。