我有一個關於C++列表的問題。下面是我不太明白的代碼。C++列表<T>如何處理插入元素?
#include <iostream>
#include <list>
#include <string>
using namespace std;
struct Customer {
string firstName;
string lastName;
};
void replace(list<Customer>& customers, int index, Customer item)
{
std::list<Customer>::iterator it = customers.begin();
advance(it, index);
*it = item;
}
Customer get (list<Customer>& customers, int index)
{
std::list<Customer>::iterator it = customers.begin();
advance(it, index);
return *it;
}
int main() {
list<Customer> customers;
Customer c1;
c1.firstName = "Jack";
c1.lastName = "Smith";
Customer c2;
c2.firstName = "Jane";
c2.lastName = "Doe";
insert(customers, 50, c1);
cout << get(customers,0).firstName << endl; //outputs Jack even though I inserted it at index 50
insert(customers, 49, c2);
cout << get(customers,0).firstName << endl; //outputs Jane
cout << get(customers,50).firstName << endl; //where did Jack go?
return 0;
}
我正在使用Eclipse C++和gcc。所以我的問題是:
1 - 爲什麼這個例子不會崩潰,因爲我直接在索引50插入項目?
2 - 索引0 - 49處的點發生了什麼?
3 - 在insert()和get()方法中,檢查列表大小的索引是否正確並確保它們不通過列表邊界?
未定義的行爲,在超出'end()'前進的迭代器的位置。這意味着該方案可以做任何事情 - 包括不會崩潰,並做你所看到的。 –
此外,您的插入不插入,但在給定的位置替換項目。 – hivert
將方法名稱從insert()更改爲replace(),錯過了該方法。所以正確的做法是手動檢查傳入的索引是否在預期範圍內? –