【cpp】【python】一个坑,python中append列表和cpp push_back emplace_back 不同

RT

做项目中发现,python中是原对象的引用,如果修改会对列表中的值产生作用,cpp则不会,是复制了一个临时对象。
python中需要使用copy(),来创建副本。

例子:

#错误使用data的信息,导致samples内信息错误,在clear后,也被clear了
#应当改为使用data.copy
for line in lines:
    key, value = line.split(': ')
    data[key] = float(value)
    if key == "msg.nohCtrlOutput.targetAcceleration":
        self.samples.append(data)
        data.clear()  # 注意这里是调用 clear() 方法lines:

总之,C++ 的 emplace_back 允许在容器内部构造新的元素,而不会影响到已有的对象。这与 Python 中的列表(list)的操作行为不同,因为 Python 列表存储的是对象的引用,而不是对象本身

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: QVector的appendpush_back都是向QVector添加元素的函数。 append函数将一个元素添加到QVector的末尾,可以添加一个元素或者一个QVector。 push_back函数与append函数作用相同,将一个元素添加到QVector的末尾,但是只能添加一个元素。 两者的区别在于,append函数可以添加一个QVector,而push_back函数只能添加一个元素。 ### 回答2: QVector是Qt常用的数据结构之一,它类似于C++的std::vector,可以用来存储任意类型的数据。QVector包含了很多有用的成员函数,其有两个常用的函数是appendpush_back,本文将详细介绍这两个函数的用法和区别。 1. append函数 append是QVector最常用的成员函数之一,主要用于在QVector的末尾添加元素。它的语法如下: ``` void QVector::append(const T& value) ``` 其,T代表要添加的元素的类型,value是要添加的元素的值。 使用示例: ``` QVector<int> vec; vec.append(1); vec.append(2); vec.append(3); ``` 在上面的示例,我们创建了一个空的QVector<int>,然后分别使用append函数在末尾添加了1、2、3三个元素。注意,QVector是一个动态数组,它会随着元素的不断添加自动扩展大小。 2. push_back函数 push_back函数与append函数类似,也用于在QVector的末尾添加元素,但是它的语法略有不同: ``` void QVector::push_back(const T& value) ``` 这里的语法与C++的std::vector相同。同样,T代表要添加的元素的类型,value是要添加的元素的值。 使用示例: ``` QVector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); ``` 这个示例与上面的示例相同,只不过使用了push_back函数来添加元素。和append函数一样,push_back函数也会自动扩展QVector的大小。 3. 区别 在使用过程,我们可以发现appendpush_back函数的用法很相似,它们都是用于在QVector的末尾添加元素。实际上,这两个函数几乎没有什么区别,唯一的区别是它们的语法略有不同。 在Qt的文档,也明确指出了append函数和push_back函数的区别: - append函数是QVector的成员函数,可以看做是QVector封装的一部分; - push_back函数是STLstd::vector的成员函数,Qt只是将它兼容到了QVector。 因此,推荐使用append函数,尤其是在Qt的项目,因为它更符合Qt的封装思想。只有在需要与C++的std::vector交互时,才使用push_back函数。例如,推荐使用append函数: ``` QVector<int> vec; vec.append(1); vec.append(2); vec.append(3); ``` 最后,需要注意的是,无论是append函数还是push_back函数,在连续添加大量元素时都会带来很大的性能损失,比较好的解决办法是在添加之前调用一次reserve函数,为QVector预留足够的空间。例如: ``` QVector<int> vec; vec.reserve(10000); for(int i=0; i<10000; ++i){ vec.append(i); } ``` 这样,在添加元素时,QVector不需要重新分配内存,可以避免频繁的内存分配和释放操作,提高程序性能。 ### 回答3: QVector是Qt框架提供的一个容器类,可以存储同类型的数据。在QVector,有两个常见的添加元素的方法,分别是appendpush_back。 append方法是将元素添加到QVector队尾,如果队列的长度不够大,则会自动分配空间。这个方法的时间复杂度是O(1),即添加元素的效率非常高。append函数可以使用一个对象作为参数,也可以使用一个QVector对象作为参数,将其他QVector对象的所有元素添加到当前对象push_back方法是STL标准库提供的一个添加元素的方法,在Qt也有相应的实现。push_back方法与append类似,也是将元素添加到QVector队尾,如果队列的长度不够大,则会自动分配空间。与append不同的是,push_back方法实际上是调用了append方法,时间复杂度也是O(1)。push_back函数只能使用一个对象作为参数,不能使用QVector对象作为参数。 对于两者的选择,通常情况下,选择哪个方法都无所谓,因为它们的效率几乎相同。但是有一些情况下,append方法会更加有效率。例如,如果添加的元素是一个QVector对象,使用append方法只需要分配一次内存,而使用push_back方法需要两次内存分配,这样会降低添加元素的效率。 在使用QVector时,需要注意的是,如果QVector已经分配了足够的内存,那么在添加新元素时,不会发生重新分配内存的过程。这样可以节省时间和内存,提高程序的效率和运行速度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值