##實戰c++中的vector系列--將迭代器轉換為索引
stl的迭代器很方便 用于各種算法。
但是一想到vector,我們總是把他當做數組,總喜歡使用下標索引,而不是迭代器。
這里有個問題就是如何把迭代器轉換為索引:
~~~
#include <vector>
typedef std::vector<char *> MYARRAY;
// This does the trick
inline const int iterator_to_index(MYARRAY &a, MYARRAY::iterator it)
{
return it - a.begin();
}
// Example use
main()
{
MYARRAY a;
int index;
a.push_back("one");
a.push_back("two");
a.push_back("three");
for (MYARRAY::iterator it = a.begin(); it != a.end(); it++)
{
index = iterator_to_index(a, it);
printf("index=%d\n", index);
}
}
~~~
一、數組習慣用法
對于內置數組我們可以顯式地把數組的元素初始化為一組常量值,例如 :?
int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };
我們不能用同樣的方法顯式地初始化 vector ,但是可以將 vector 初始化為一個已有數組的全部或一部分,只需指定希望被用來初始化 vector 的數組的開始地址以及數組最末元的下一位置來實現,例如:?
// 把 ia 的 6 個元素拷貝到 ivec 中?
vector ivec( ia, ia+6 );
被傳遞給ivec 的兩個指針標記了用來初始化對象的值的范圍, 第二個指針總是指向要拷貝的末元素的下一位置 ,標記出來的元素范圍也可以是數組的一個子集,例如 :
// 拷貝 3 個元素 ia[2], ia[3], ia[4]?
vector ivec( &ia[ 2 ], &ia[ 5 ] );
與內置數組不同 vector 可以被另一個 vector 初始化 或被賦給另一個 vector
注意 下面的定義
~~~
vector< int > ivec;
ivec[ 0 ] = 1024; //錯誤
~~~
就是錯誤的 ,因為 ivec 還沒有第一個元素 ,我們只能索引 vector 中已經存在的元素 size()操作返回 vector 包含的元素的個數 。
下面的錯誤并不少見:
~~~
const int size = 7;
int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 };
vector< int > ivec( size );
for ( int ix = 0; ix < size; ++ix )
ivec.push_back( ia[ ix ]);
~~~
程序結束時ivec 包含 14 個元素, ia 的元素從第八個元素開始插入。
- 前言
- 構造、operator=和assign區別
- 將迭代器轉換為索引
- copy set to vector(別混淆了reserve和resize)
- 使用vector構造二維數組
- 可怕的迭代器失效(vector重新申請內存)
- 可怕的迭代器失效之二(刪除vector中元素)
- vector<unique_ptr<>>初始化(所有權轉移)
- vector<unique_ptr<>>作為函數的參數
- vector<unique_ptr<>>賦值給vector<unique_ptr<>>
- creating vector of local structure、vector of structs initialization
- 知道emplace_back為何優于push_back嗎?
- emplace_back造成的引用失效
- vector的一些異常
- vector的遍歷(stl算法、vector迭代器(不要在循環中判斷不等于end())、operator[])
- 使用sort算法對vector進行排序(對vector<string>排序、使用穩定的排序std::stable_sort())
- vector應用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
- 使用sort算法對vector<unique_ptr<string>>進行排序(sort函數“應輸入 2 個參數,卻提供了 3 個)
- 對vector<自定義類>使用std::find 和 std::find_if 算法