gpt4 book ai didi

c++ - 将空的初始值设定项列表分配给现有 vector 或映射的效果?

转载 作者:行者123 更新时间:2023-11-30 01:39:59 28 4
gpt4 key购买 nike

我有 2 个容器,一个 std::vector 和一个 std::map :

vector<int> my_vector;
map<string,int> my_map;
my_vector.push_back(3);

// elaboration of my_vector;
...

my_map["Hello"] = 1;

// elaboration of my_map
...

后来我这样做:

my_map = {};
my_vector = {};

这应该使 2 个容器成为 2 个空容器,对吧?此外,之前从 my_mapmy_vector 指向的内存会发生什么?

(我使用的是 C++11)

最佳答案

是的,这两个赋值都会导致 vector 和映射被清空。这两种分配在 vector 和映射的大小上都是线性的,因为两者都要求在分配之前销毁容器中的每个元素,并且这需要 O(n) 遍历。 vector 重用内存( https://wandbox.org/permlink/eIJEcEqERC2ybAjU )我认为映射是否重用内存是实现定义的(或者至少我无法从文档中看出)

至于棘手的部分(在我看来),这里调用了哪个赋值运算符?它是来自初始值设定项列表的赋值运算符还是 vector 和映射的移动赋值运算符(因为 {} 可以隐式转换为任一实例)。我在这里找到了 cppreference 的这句话 http://en.cppreference.com/w/cpp/language/operator_assignment#Builtin_direct_assignment

Note that, if a non-template assignment operator from some non-class type is available, it is preferred over the copy/move assignment in E1 = {} because {} to non-class is an identity conversion, which outranks the user-defined conversion from {} to a class type.

因此,如果有一个非模板赋值运算符,std::vector 确实有。这优于模板化 std::intializer_list 赋值运算符中的赋值运算符。您只需检查界面即可了解发生了什么。您可以在这里看到相同的内容

#include <initializer_list>
#include <iostream>
#include <string>
#include <vector>
#include <map>

using std::cout;
using std::endl;
using std::string;

class Something {
public:
Something() {
cout << __PRETTY_FUNCTION__ << endl;
}
template <typename U>
Something(std::initializer_list<U>) {
cout << __PRETTY_FUNCTION__ << endl;
}
Something& operator=(const Something&) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}
Something& operator=(Something&&) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}
Something(const Something&) {
cout << __PRETTY_FUNCTION__ << endl;
}
Something(Something&&) {
cout << __PRETTY_FUNCTION__ << endl;
}
template <typename U>
Something& operator=(std::initializer_list<U>) {
cout << __PRETTY_FUNCTION__ << endl;
return *this;
}

// to silence unused variable warning
int get_something() {
return this->something;
}
private:
int something{1};
};

int main() {
auto something = Something{};
something = {};
something = {1, 2, 3};
}

其输出是

Something::Something()
Something::Something()
Something &Something::operator=(Something &&)
Something &Something::operator=(std::initializer_list<U>) [U = int]

请注意,上述情况不是 std::vector 发生的情况,因为它的 initializer_list 赋值运算符不是模板,因此会被调用。

关于c++ - 将空的初始值设定项列表分配给现有 vector 或映射的效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441387/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com