C++中list列表中的splice函数有3中声明方式,请问这三种声明方式里面的参数表示啥意思

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中list列表中的splice函数有3中声明方式,请问这三种声明方式里面的参数表示啥意思相关的知识,希望对你有一定的参考价值。

void splice ( iterator position, list<T,Allocator>& x );
void splice ( iterator position, list<T,Allocator>& x, iterator i );
void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
第一个参数我知道表示的是插入位置,第一种声明里第二个表示的是什么?是指x这整个列表吗?还有第二种声明第三个参数是什么意思?第三种声明是不是指列表X里面第first个位置到第last个位置的元素?

参考技术A std::list::splice

entire list (1)
void splice (iterator position, list& x);

single element (2)
void splice (iterator position, list& x, iterator i);

element range (3)
void splice (iterator position, list& x, iterator first, iterator last);

Transfer elements from list to list
Transfers elements from x into the container, inserting them at position.
The first version (1) transfers all the elements of x into the container.
The second version (2) transfers only the element pointed by i from x into the container.
The third version (3) transfers the range [first,last) from x into the container.
翻译:
链表拼接。
从列表中转移元素列表
将X中元素转移到容器中,在位置positon插入他们。
第一个版本(1)传输X的所有元素插入到容器中。
第二个版本(2)只转让x中由i指出的元素进入容器中。
第三个版本(3)X [first,last)传送范围到容器中。本回答被提问者采纳

如何从离子列表中删除离子项目?

【中文标题】如何从离子列表中删除离子项目?【英文标题】:How to delete an ion-item from ion-list? 【发布时间】:2022-01-15 16:24:04 【问题描述】:

我正在尝试为存储在 Firestore 实例中的离子列表中的离子项目实现删除功能。我试图用.splice() 函数解决它,但这会引发以下错误:

'Observable'.ts(2339) 类型上不存在属性'splice'

有人知道如何解决这个问题吗?

代码如下所示:

HTML

  <ion-item-sliding *ngFor="let space of spaces | async; let i = index">
    <ion-item>
      <ion-icon name="ellipse-outline"></ion-icon>
      <ion-label>
        &nbsp;  space.spaceName 
      </ion-label>
    </ion-item>
    <ion-item-options (ionSwipe)="deleteSpace(i)">
      <ion-item-option color="success" (click)="editspacenameModal()"> 
        Edit
      </ion-item-option>
      <ion-item-option color="danger" (click)="deleteSpace(i)" expandable> 
        Delete
      </ion-item-option>
    </ion-item-options>
  </ion-item-sliding>

TS

export class ActivitiesPage implements OnInit 

  spaces: Observable<any[]>; 

...

deleteSpace(i) 
    this.spaces.splice(i,1);
    console.log('deleteSpace() called')
  

【问题讨论】:

【参考方案1】:

我是这样解决的:

HTML

<ion-item-sliding *ngFor="let space of spaces | async">
    <ion-item detail>
      <ion-icon name="ellipse-outline" start></ion-icon>
      <ion-label>
        &nbsp;  space.spaceName 
      </ion-label>
    </ion-item>
    <ion-item-options (ionSwipe)="deleteSpace(space)">

      <ion-item-option color="success" (click)="editspaceModal(space)"> Edit </ion-item-option>
      <ion-item-option color="danger" (click)="deleteSpace(space)" expandable> Delete </ion-item-option>
    
    </ion-item-options>
  </ion-item-sliding>

TS

  deleteSpace(space: Space): void 
    console.log('space.id',space)
      this.setisDeleted(space);
  

  setisDeleted(space): Promise<any> 

    const isDeleted = true;
    
    return this.angularFirestore
    .collection('accounts')
    .doc(this.userId)
    .collection("spaces")
    .doc(space.spaceId)
    .update( isDeleted )
  v

【讨论】:

【参考方案2】:

您需要过滤实际的数组,而不是围绕它的 observable。因此,您会将 Observable 的内容(它是一个 any[])映射到过滤后的 spaces

  deleteSpace(i) 
    this.spaces = this.spaces.pipe(
            map(result => result.filter((r, index) => i !== index))
        )
    console.log('deleteSpace() called')
    this.spaces.subscribe((out) => console.log(out))
  

map 运算符中使用filter 将解决您的问题。

【讨论】:

这行得通:) 但是有没有办法在 Firestore 中为这个特定项目设置 isDeleted 标志?否则,该项目将在重新加载后再次显示。【参考方案3】:

一种方法是转换您的 observable 并将其过滤掉:

在这里阅读更多:

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

const data = this.yourdata.filter(item => item.property !== desiredvalue)

您还可以检测列表中的变化并直接过滤 observable。

在这里阅读更多:

https://www.learnrxjs.io/learn-rxjs/operators/filtering/filter

也许这个问题对你有帮助:

how to filter an Observable array?

【讨论】:

以上是关于C++中list列表中的splice函数有3中声明方式,请问这三种声明方式里面的参数表示啥意思的主要内容,如果未能解决你的问题,请参考以下文章

js中数组的splice()方法

c++ splice 使用

C++ STL list详解

可变參数列表

构造函数中的 C++ 初始化列表

(C++) 如何将 stl 列表声明为 extern?