C++ 中的位置索引是从 0 开始的吗?
在 C++ 中,位置索引(包括 std::string
和容器等)是从 0 开始的。
例如:
std::string
中的第一个字符的索引是0
,第二个字符的索引是1
,依此类推。如果使用
std::string::replace
来替换子字符串,第一个字符的索引也是0
。
#include <iostream> #include <string> int main() { std::string str = "Hello World!"; // 替换从索引 6 开始的 5 个字符为 "C++" str.replace(6, 5, "C++"); std::cout << str << std::endl; // 输出 "Hello C++!" return 0; }
在上面的代码中:
字符串
"Hello World!"
中,'H'
的索引是0
,'e'
的索引是1
,... 直到'W'
的索引是6
。str.replace(6, 5, "C++")
替换了从索引6
开始的 5 个字符(即"World"
)为"C++"
。
C++ 中涉及位置(索引)的相关语法,通常 所有的位置索引都是从 0 开始。这适用于大多数标准库容器和数据结构,包括字符串、数组、向量等。以下是一些常见的情况:
1. 数组(array
)索引
在 C++ 中,数组的索引从 0 开始。
int arr[] = {10, 20, 30, 40}; std::cout << arr[0] << std::endl; // 输出 10 std::cout << arr[1] << std::endl; // 输出 20
2. std::string
字符串索引
std::string
中的字符索引也是从 0 开始。
std::string str = "Hello"; std::cout << str[0] << std::endl; // 输出 'H' std::cout << str[1] << std::endl; // 输出 'e'
3. std::vector
和其他容器的索引
std::vector
和其他标准库容器(如 std::deque
, std::list
等)使用迭代器和索引进行访问时,索引也是从 0 开始的。
std::vector<int> vec = {1, 2, 3, 4}; std::cout << vec[0] << std::endl; // 输出 1 std::cout << vec[1] << std::endl; // 输出 2
4. std::map
和 std::unordered_map
虽然 std::map
和 std::unordered_map
并不使用索引(它们使用键值对),但是迭代器的顺序和位置概念中也遵循从 0 开始的约定。在迭代过程中,第一个元素的位置(迭代器)通常是索引 0。
#include <iostream> #include <map> int main() { std::map<int, std::string> m; m[1] = "one"; m[2] = "two"; auto it = m.begin(); std::cout << it->first << ": " << it->second << std::endl; // 输出 1: one it++; // 指向下一个元素 std::cout << it->first << ": " << it->second << std::endl; // 输出 2: two return 0; }
5. std::string::find
函数
std::string
的 find
函数返回找到的子字符串的起始位置,其位置是从 0 开始计算的。
std::string str = "Hello, World!"; size_t pos = str.find("World"); std::cout << pos << std::endl; // 输出 7
6. std::array
和 C++11 以后的容器
std::array
(C++11 引入)和其他现代容器中的索引从 0 开始。
#include <array> std::array<int, 4> arr = {10, 20, 30, 40}; std::cout << arr[0] << std::endl; // 输出 10
在 C++ 中,绝大多数情况涉及位置或索引时,位置索引都从 0 开始。这是一种常见的约定,在 C++ 标准库中得到广泛应用。如果某些特定的数据结构或库不遵循这个约定,它通常会在文档中明确指出。

- 上一篇:c++ replace函数
- 下一篇:狗可以吃哪些蔬菜?