Day 9 | 数组/字符串/map/set 必备知识点

数组

数组(Array)

  • 数组是一种存储相同类型元素的线性数据结构。
  • 数组的长度是固定的,一旦创建后无法改变。
  • 数组中的元素在内存中是连续存储的。
  • 访问数组元素的时间复杂度为O(1)。
  • vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。

常用API

  • 声明和初始化数组:int[] arr = new int[5];
  • 访问数组元素:int element = arr[index];
  • 修改数组元素:arr[index] = value;
  • 获取数组长度:int length = arr.length;

注意点

  • 数组越界:访问数组时,需要确保索引在合法范围内,否则会导致数组越界异常。
常见数组越界问题

        当数组定义为空数组的时候,假设 vector nums 为空,如果你调用 nums.size()不会报错,但是nums.size()-2 就会报错,因为你在操作空指针进行运算,是非法操作。

        如果提前知道数组数量,提前开辟vector可以更提高效率。

vector中push_back和emplace_back比较

push_back

  • push_back方法用于将元素添加到Vector的末尾。
  • 它接受一个参数,该参数是要添加到Vector的元素副本,它会通过拷贝构造函数进行复制。
  • push_back适用于已经存在的对象,或者可以直接复制构造的对象

emplace_back

  • emplace_back方法用于在Vector的末尾创建一个新元素。
  • 它接受可变数量的参数,并使用这些参数来构造新的元素。
  • emplace_back避免了额外的拷贝构造开销,直接在Vector内部构造对象。
  • emplace_back通常比push_back更高效。

哈希表

unordered_map

常用API

  • 声明和初始化:unordered_map<int, string> myMap;
  • 插入元素:myMap.insert(make_pair(key, value));
  • 插入元素:myMap.insert(std::pair<int,int>{a,b,c});
  • 访问元素:string value = myMap[key];
  • 删除元素:myMap.erase(key);
  • 获取元素数量:int size = myMap.size();
  • 返回key出现次数(只存在0/1):myMap.count(k);
  • 元查找是否存在当前key并返回迭代器:myMap.find(k);

unordered_set

常用API

        差不多等同于 map.

map&set注意点

关于迭代器的区别

std::set

        std::set 中的元素是键,因为它是一个集合,不包含重复元素。当使用 find 等方法在 std::set 中查找元素时,返回的迭代器指向的是元素本身。所以,你需要通过 * 操作符解引用迭代器来获取元素的值。

std::map:

        std::map 中的元素是键值对,因此迭代器指向的是一个包含键值对的对象。你可以通过 -> 操作符来访问键值对中的成员,其中 first 是键,second 是值。

        对于 std::map,迭代器的 -> 操作符已经被重载,允许你直接访问键值对的成员,而不需要显式地使用 * 操作符。这是因为 std::map 的迭代器是一个类对象,其 -> 操作符被定义为返回指向值部分的引用,这使得语法更加直观。它的迭代器直接提供了方便的访问方式,而不需要额外的解引用。


字符串

常用API

  1. 字符串的创建和初始化:

    • 使用双引号初始化字符串字面值:std::string str = "Hello";
    • 使用字符数组初始化字符串对象:char charArray[] = "World"; std::string str(charArray);
  2. 字符串的访问和修改:

    • 使用+=操作符或append()函数在字符串末尾添加字符或字符串:str += '!'; 或 str.append(" World");  += 和append()效率高过 + 操作
    • 使用insert()函数在指定位置插入字符或字符串:str.insert(5, " there");
    • 使用erase()函数删除指定位置的字符或一段子串:str.erase(1, 5); 删除1到5的字符,不包括5
    • erase(1) 删除索引为1的字符,其会返回一个迭代器,它指向被删除元素后面的元素.如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置.如果p本身就是指向超出末端的下一位置的迭代器,则该函数为定义。
  3. 字符串的比较:

    • 使用==!=<><=>=等操作符进行字符串的比较:bool result = (str1 == str2);
  4. 字符串的长度和容量:

    • 使用length()函数或size()函数获取字符串的长度:int len = str.length();
    • 使用capacity()函数获取字符串的容量(即分配的内存大小):int cap = str.capacity();
  5. 字符串的查找和替换:

    • 使用find()函数查找子串在字符串中的位置:size_t pos = str.find("lo");
    • 使用replace()函数替换字符串中的子串:str.replace(pos, 2, "ll");
  6. 字符串的子串提取:

    • 使用substr()函数提取字符串的子串:std::string subStr = str.substr(pos, len);
  7. 字符串的空判断:

    • 使用empty()函数判断字符串是否为空:str.empty()

注意点:

        如果要让字符串和数字作比较,则需要对数字上引号' 0',或者直接做加减法。

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 如果你想要将一个字符串和一个数组拼接在一起,你可以使用concat()方法。当字符串拼接数组时,concat()会将数组默认转换为字符串,并将其拼接到字符串后面。所以结果是一个字符串。例如,如果有一个字符串str和一个数组arr,使用str.concat(arr)会返回"abc1,a,3"。\[1\]\[2\]如果你想要将一个数组和一个字符串拼接在一起,concat()会将字符串直接拼接到数组后面。所以结果是一个数组。例如,如果有一个字符串str和一个数组arr,使用arr.concat(str)会返回\[1, 'a', 3, 'abc'\]。\[1\]\[2\]另外,如果你已经有一个字符串数组,你可以使用strings.Join()函数来拼接字符串数组。这个函数会根据指定的分隔符将字符串数组中的元素拼接在一起。例如,如果有一个字符串数组words,使用strings.Join(words, ",")会返回"大理,苏州,西安"。\[3\] #### 引用[.reference_title] - *1* *2* [js中的concat函数-字符串拼接+数组拼接](https://blog.csdn.net/love_every_day/article/details/108583967)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [golang字符串拼接,字符串数组字符串](https://blog.csdn.net/u013317445/article/details/114839914)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值