数组
数组(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
-
字符串的创建和初始化:
- 使用双引号初始化字符串字面值:
std::string str = "Hello";
- 使用字符数组初始化字符串对象:
char charArray[] = "World"; std::string str(charArray);
- 使用双引号初始化字符串字面值:
-
字符串的访问和修改:
- 使用
+=
操作符或append()
函数在字符串末尾添加字符或字符串:str += '!';
或str.append(" World"); += 和append()效率高过 + 操作
- 使用
insert()
函数在指定位置插入字符或字符串:str.insert(5, " there");
- 使用
erase()
函数删除指定位置的字符或一段子串:str.erase(1, 5); 删除1到5的字符,不包括5
erase(1) 删除索引为1的字符,其会
返回一个迭代器,它指向被删除元素后面的元素.如果p指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置.如果p本身就是指向超出末端的下一位置的迭代器,则该函数为定义。
- 使用
-
字符串的比较:
- 使用
==
、!=
、<
、>
、<=
、>=
等操作符进行字符串的比较:bool result = (str1 == str2);
- 使用
-
字符串的长度和容量:
- 使用
length()
函数或size()
函数获取字符串的长度:int len = str.length();
- 使用
capacity()
函数获取字符串的容量(即分配的内存大小):int cap = str.capacity();
- 使用
-
字符串的查找和替换:
- 使用
find()
函数查找子串在字符串中的位置:size_t pos = str.find("lo");
- 使用
replace()
函数替换字符串中的子串:str.replace(pos, 2, "ll");
- 使用
-
字符串的子串提取:
- 使用
substr()
函数提取字符串的子串:std::string subStr = str.substr(pos, len);
- 使用
-
字符串的空判断:
- 使用
empty()
函数判断字符串是否为空:str.empty()
- 使用
注意点:
如果要让字符串和数字作比较,则需要对数字上引号' 0',或者直接做加减法。