當前位置:首頁 » 編程語言 » c語言調用迭代器
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言調用迭代器

發布時間: 2022-10-03 10:13:35

A. c語言a=a++的運算順序是怎麼樣的代碼如下

a=a++;
先執行a++,此時a=2,然而a++返回的是1,因此再執行a=a的時候,其實執行的是a=1;
因此,a=a++; 其實就是a=a。
其實這道題考察的是對自增運算符的內部邏輯理解,自增運算符可以理解成是調用了一個函數,++放在前面和後面只不過是返回的值不同而已。

補充:這個問題太有意思了,因為按照我的理解,答案是1,但是在VS2019上面列印出來是2,然後去網上找在線編譯器,列印出來是1。
我對++的理解是源於迭代器的++操作的,使用迭代器進行驗證,發現和我上述的解釋相符,所以唯一的解釋就是V2019在int的++上做了特殊處理。
有一些樓層說先賦值再++,如果是這樣的話,為什麼b=a++還是等於1呢?
我現在還沒搞明白VS2019為啥會輸出2,可能要大神解答了。
下面的代碼輸出的是1,說先賦值再++的朋友可以考慮一下。

vector<int> costs = { 1,2 };
vector<int>::iterator i = costs.begin();
i = i++;
printf("%d", *i);

B. c++ map使用問題和迭代器問題 編譯器:VS2010旗艦版

cout<<"刪除關鍵字為" 范偉 "的所有元素。\n";
改為
cout<<"刪除關鍵字為\" 范偉 \"的所有元素。\n";

在解決方案窗口中對項目名滑鼠右擊,選擇屬性,字元集選擇多位元組字元集 ,vs2010默認是用unicode字元集的

C. C語言中怎樣獲得字元串中的單個字元

根據字元串存儲的變數的不同,方法不同,參考代碼:

存儲在char數組中(支持C/C++)

charstr[]="hello";
inti;
for(i=0;str[i];i++)
printf("%c ",str[i]);//以數組方式引用一個字元:str[i]
for(i=0;*(str+i);i++)
printf("%c ",*(str+i));//以指針方式引用一個字元:*(str+i)

存儲在string中(僅支持C++)

stringstr="abcde";
for(string::iteratoriter=s.begin();iter!=s.end();iter++)//使用迭代器
{
cout<<*iter<<endl;
}
cout<<endl;

for(inti=0;i<s.length();i++)
{
cout<<s[i]<<endl;//使用數組方式調用,得到單個元素
}

D. c語言 循環題目

題意大概意思是這樣:循環進入後首先執行循環,首先判斷i是否小於7,再判斷如果I被2整除,i就自增1,s就是當前s和當前i相加的和,另個循環例如for

1.for 有兩種形式:一種是數字形式,另一種是通用形式。
數字形式的 for 循環,通過一個數學運算不斷地運行內部的代碼塊。 下面是它的語法:
block 將把 name 作循環變數。 從第一個 exp 開始起,直到第二個 exp 的值為止, 其步長為第三個 exp 。 更確切的說,一個 for 循環看起來是這個樣子
注意下面這幾點:
所有三個控製表達式都只被運算一次, 表達式的計算在循環開始之前。 這些表達式的結果必須是數字。
var,limit,以及 step 都是一些不可見的變數。 這里給它們起的名字都僅僅用於解釋方便。
如果第三個表達式(步長)沒有給出,會把步長設為 1 。
你可以用 break 和 goto 來退出 for 循環。
循環變數 v 是一個循環內部的局部變數; 如果你需要在循環結束後使用這個值, 在退出循環前把它賦給另一個變數。
2.通用形式的 for 通過一個叫作 迭代器 的函數工作。每次迭代,迭代器函數都會被調用以產生一個新的值, 當這個值為 nil 時,循環停止。 通用形式的 for 循環的語法如下:
注意以下幾點:
explist 只會被計算一次。 它返回三個值, 一個 迭代器 函數, 一個 狀態, 一個 迭代器的初始值。
f, s,與 var 都是不可見的變數。 這里給它們起的名字都只是為了解說方便。
你可以使用 break 來跳出 for 循環。
環變數 var_i 對於循環來說是一個局部變數; 你不可以在 for 循環結束後繼續使用。 如果你需要保留這些值,那麼就在循環跳出或結束前賦值到別的變數里去。
到第二個 exp 的值為止, 其步長為第三個 exp 。 更確切的說,一個 for 循環看起來是這個樣子
3.注意下面這幾點:
所有三個控製表達式都只被運算一次, 表達式的計算在循環開始之前。 這些表達式的結果必須是數字。
var,limit,以及 step 都是一些不可見的變數。 這里給它們起的名字都僅僅用於解釋方便。
如果第三個表達式(步長)沒有給出,會把步長設為 1 。
通用形式的 for 通過一個叫作 迭代器 的函數工作。 每次迭代,迭代器函數都會被調用以產生一個新的值, 當這個值為 nil 時,循環停止。 通用形式的 for 循環的語法如下:
注意以下幾點:
explist 只會被計算一次。 它返回三個值, 一個 迭代器 函數, 一個 狀態, 一個 迭代器的初始值。
f, s,與 var 都是不可見的變數。 這里給它們起的名字都只是為了解說方便。
你可以使用 break 來跳出 for 循環。
環變數 var_i 對於循環來說是一個局部變數; 你不可以在 for 循環結束後繼續使用。 如果你需要保留這些值,那麼就在循環跳出或結束前賦值到別的變數里去。
到第二個 exp 的值為止, 其步長為第三個 exp 。 更確切的說,一個 for 循環看起來是這個樣子

E. c++ 迭代器和 指針的區別

指針是C語言裡面就有的東西,而迭代器是C++裡面才有的,指針用起來靈活,效率高。迭代器功能更豐富一些(不見得是強大一些),c++的stl裡面很多演算法都是基於迭代器的,一部分演算法的參數可以傳遞指針作為迭代器使用

F. 怎樣在C語言中修改字元串的一個字元的值

根據字元串存儲的變數的不同,方法不同,參考代碼:
存儲在char數組中(支持C/C++)
char
str[]="hello"
;
int
i;
for(
i=0;str[i];i++
)
printf("%c\n",
str[i]
);
//以數組方式引用一個字元:str[i]
for(
i=0;*(str+i);i++
)
printf("%c\n",
*(str+i)
);
//以指針方式引用一個字元:*(str+i)
存儲在string中(僅支持C++)
string
str="abcde";
for(string::iterator
iter
=
s.begin();
iter!=s.end();
iter++)
//使用迭代器
{
cout<<*iter<<endl;
}
cout<<endl;
for(
int
i=0;i<s.length();i++
)
{
cout<<s[i]<<endl;
//使用數組方式調用,得到單個元素
}

G. c++容器,成員函數Insert傳遞3個迭代器參數的使用問題。

vector屬於std命名域的,因此需要通過命名限定,如下完成你的代碼:
using std::vector;
vector vInts;
或者連在一起,使用全名:
std::vector vInts;
建議使用全局的命名域方式:using namespace std;
函數
表述
c.assign(beg,end)c.assign(n,elem)
將[beg; end)區間中的數據賦值給c。將n個elem的拷貝賦值給c。
c.at(idx)
傳回索引idx所指的數據,如果idx越界,拋出out_of_range。
c.back()
傳回最後一個數據,不檢查這個數據是否存在。
c.begin()
傳回迭代器中的第一個數據地址。
c.capacity()
返回容器中數據個數。
c.clear()
移除容器中所有數據。
c.empty()
判斷容器是否為空。
c.end()
指向迭代器中的最後一個數據地址。
c.erase(pos)
c.erase(beg,end)
刪除pos位置的數據,傳回下一個數據的位置。
刪除[beg,end)區間的數據,傳回下一個數據的位置。
c.front()
傳回第一個數據。
get_allocator
使用構造函數返回一個拷貝。
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
在pos位置插入一個elem拷貝,傳回新數據位置。在pos位置插入n個elem數據。無返回值。在pos位置插入在[beg,end)區間的數據。無返回值。
c.max_size()
返回容器中最大數據的數量。
c.pop_back()
刪除最後一個數據。
c.push_back(elem)
在尾部加入一個數據。
c.rbegin()
傳回一個逆向隊列的第一個數據。
c.rend()
傳回一個逆向隊列的最後一個數據的下一個位置。
c.resize(num)
重新指定隊列的長度。
c.reserve()
保留適當的容量。
c.size()
返回容器中實際數據的個數。
c1.swap(c2)
swap(c1,c2)
將c1和c2元素互換。同上操作。
vector
cvector c1(c2)
vector c(n)
ector c(n, elem)
vector c(beg,end)
c.~ vector ()
創建一個空的vector。復制一個vector。創建一個vector,含有n個數據,數據均已預設構造產生。創建一個含有n個elem拷貝的vector。創建一個以[beg;end)區間的vector。銷毀所有數據,釋放內存。
operator[]
返回容器中指定位置的一個引用。
創建一個vector
vector容器提供了多種創建方法,下面介紹幾種常用的。
創建一個Widget類型的空的vector對象:
vector vWidgets;
創建一個包含500個Widget類型數據的vector:
vector vWidgets(500);
創建一個包含500個Widget類型數據的vector,並且都初始化為0:
vector vWidgets(500, Widget(0));
創建一個Widget的拷貝:
vector vWidgetsFromAnother(vWidgets);
向vector添加一個數據
vector添加數據的預設方法是push_back()。push_back()函數表示將數據添加到vector的尾部,並按需要來分配內存。例如:向vector中添加10個數據,需要如下編寫代碼:
for(int i= 0;i<10; i++) {
vWidgets.push_back(Widget(i));
}
獲取vector中制定位置的數據
vector裡面的數據是動態分配的,使用push_back()的一系列分配空間常常決定於文件或一些數據源。如果想知道vector存放了多少數據,可以使用empty()。獲取vector的大小,可以使用size()。例如,如果想獲取一個vector v的大小,但不知道它是否為空,或者已經包含了數據,如果為空想設置為-1,你可以使用下面的代碼實現:
int nSize = v.empty() ? -1 : static_cast(v.size());
訪問vector中的數據
使用兩種方法來訪問vector。
1、 vector::at()
2、 vector::operator[]
operator[]主要是為了與C語言進行兼容。它可以像C語言數組一樣操作。但at()是我們的首選,因為at()進行了邊界檢查,如果訪問超過了vector的范圍,將拋出一個例外。由於operator[]容易造成一些錯誤,所有我們很少用它,下面進行驗證一下:
分析下面的代碼:
vector v;
v.reserve(10);
for(int i=0; i<7; i++) {
v.push_back(i);
}
try {int iVal1 = v[7];
// not bounds checked - will not throw
int iVal2 = v.at(7);
// bounds checked - will throw if out of range
} catch(const exception& e) {
cout << e.what();
}
刪除vector中的數據
vector能夠非常容易地添加數據,也能很方便地取出數據,同樣vector提供了erase(),pop_back(),clear()來刪除數據,當刪除數據時,應該知道要刪除尾部的數據,或者是刪除所有數據,還是個別的數據。
Remove_if()演算法 如果要使用remove_if(),需要在頭文件中包含如下代碼::
#include
Remove_if()有三個參數:
1、 iterator _First:指向第一個數據的迭代指針。
2、 iterator _Last:指向最後一個數據的迭代指針。
3、 predicate _Pred:一個可以對迭代操作的條件函數。
條件函數
條件函數是一個按照用戶定義的條件返回是或否的結果,是最基本的函數指針,或是一個函數對象。這個函數對象需要支持所有的函數調用操作,重載operator()()操作。remove_if()是通過unary_function繼承下來的,允許傳遞數據作為條件。
例如,假如想從一個vector中刪除匹配的數據,如果字串中包含了一個值,從這個值開始,從這個值結束。首先應該建立一個數據結構來包含這些數據,類似代碼如下:
#include
enum findmodes {
FM_INVALID = 0,
FM_IS,
FM_STARTSWITH,
FM_ENDSWITH,
FM_CONTAINS
};
typedef struct tagFindStr {
UINT iMode;
CString szMatchStr;
} FindStr;
typedef FindStr* LPFINDSTR;
然後處理條件判斷:
class FindMatchingString : public std::unary_function {
public:
FindMatchingString(const LPFINDSTR lpFS) :
m_lpFS(lpFS) {
}
bool operator()(CString& szStringToCompare) const {
bool retVal = false;
switch (m_lpFS->iMode) {
case FM_IS: {
retVal = (szStringToCompare == m_lpFDD->szMatchStr);
break;
}
case FM_STARTSWITH: {
retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szWindowTitle);
break;
}
case FM_ENDSWITH: {
retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())
== m_lpFDD->szMatchStr);
break;
}
case FM_CONTAINS: {
retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
break;
}
}
return retVal;
}
private:
LPFINDSTR m_lpFS;
};
通過這個操作你可以從vector中有效地刪除數據:
FindStr fs;
fs.iMode = FM_CONTAINS;
fs.szMatchStr = szRemove;
vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());
Remove(),remove_if()等所有的移出操作都是建立在一個迭代范圍上的,不能操作容器中的數據。所以在使用remove_if(),實際上操作的時容器里數據的上面的。
看到remove_if()實際上是根據條件對迭代地址進行了修改,在數據的後面存在一些殘余的數據,那些需要刪除的數據。剩下的數據的位置可能不是原來的數據,但他們是不知道的。
調用erase()來刪除那些殘余的數據。注意上面例子中通過erase()刪除remove_if()的結果和vs.enc()范圍的數據。

H. 請C語言高手幫忙做一下c程序設計題目

沒工夫編了,給你找了個現成的,網路知道里的。

#include <iostream>
#include <string>
#include "address.h"
#include "addressList.h"
#include "addressBook.h"
using namespace std;
int main()
{
new AddressBook; //開啟通信錄
return 0;
}
ostream& operator<<(ostream& os, const RecordList& c_rl)
{
RecordList::const_iterator it;
RecordList::const_iterator it_end =c_rl.end();
for (it=c_rl.begin();it!=it_end; it++)
{
os << (*it)->name << '\n' << (*it)->tel << '\n';
}
return os;
}
istream& operator>> (istream& is, RecordList& rl)
{
Record* rec;
string name;
while (true)
{

//注意這里使用的是全局的getline()函數,而不是istream的成員函
//數.全局的getling()函數將從istream中取出最後一個分隔符,
//而istream的成員函數getline則不會
getline(is,name);
if (name =="")
break;
rec = new Record;
rec->name=name;
getline(is,rec->tel );
rl.push_back(rec);
}
return is;
}

#include<stdlib.h>
#include<fstream>
#include "addressBook.h"

using namespace std;

AddressBook::AddressBook()
{
isModified = false;
start();
}

AddressBook::~AddressBook()
{
}

//功能:顯示歡迎畫面,並開始進行用戶交互處理
void AddressBook::start()
{
cout<<"\n"
<<"\t******************************\n"
<<"\t* 這是一個 *\n"
<<"\t* 簡單的通信錄程序 *\n"
<<"\t* 可以對通信錄進行簡單管理 *\n"
<<"\t* 歡迎使用通信錄 *\n"
<<"\t******************************\n"
<<"\n";
handleMenu();
}

//功能:顯示通信錄菜單,返回用戶選擇的選項
//返回:用戶選擇的選項,是1-9之間的一個字元

char AddressBook::menuSelect()
{
cout<<"\n"
<<"1.顯示記錄\n"
<<"2.查詢記錄\n"
<<"3.增加記錄\n"
<<"4.刪除記錄\n"
<<"5.保存記錄\n"
<<"6.讀取記錄\n"
<<"7.新建記錄\n"
<<"8.結束運行\n"
<<"\n左邊數字對應功能選擇,請選1-8:";
char choice[2];
while(true)
{
cin.getline(choice,2);
if(choice[0]<'1' || choice[0]>'8')
cout<<"\n輸入錯誤,重選1-8:";
else
break;
}
return choice[0];
}

//功能:根據用戶選擇的項目調用相應的處理函數
void AddressBook::handleMenu()
{
while(true)
{
switch(menuSelect())
{
case '1':
displayRecords();
break;
case '2':
queryRecord();
break;
.......

//功能:列印用於顯示記錄信息時的表頭
void AddressBook::dispTable()
{

}

//功能:顯示通信錄中的所有記錄
void AddressBook::displayRecords()
{

}

//功能:首先檢查通信錄是否已保存,然後清空當前通信錄中所有記錄
//注意:該函數覆蓋了基類中的函數
void AddressBook::clear()
{

}
//功能:查詢指定記錄
void AddressBook::queryRecord()
{

//功能:向當前通信錄追加新的記錄
//注意:該函數重載了基類中的函數
void AddressBook::addRecord()
{

}

/*

//說明:如果使用string 類,效果更好。下面是實現本功能的程序代碼:
while(true)
{
//輸入新記錄
string name;
cout<<"姓名:";
getline(cin,name);
//如果輸入的姓名為「0」,則結束添加記錄的操作
if(name=="0")
break;
Record* rec=new Record;
rec->name=name;
cout<<"電話:";
getline(cin,rec->tel);
//將新記錄加入鏈表
AddressList::addRecord(rec);
}

//同理,下面的成員函數removeRecord()中的判斷,可以使用如下替代方法:
string str;
getline(cin,str);
while(true)
{
if(str[0]!='1' && str[0]!='2')
{
cout<<"輸入錯誤,重選1-2:";
getline(cin,str);
}
else
break;
}

*/

//功能:從當前通信錄移除指定的記錄
//注意:該函數重載了基類中的函數
void AddressBook::removeRecord()
{
if(empty())
{
cout<<"通信錄已空,退出刪除操作!"<<endl;
return;
}
//選擇獲取需要刪除的記錄的方式
cout<<"可以通過姓名或電話刪除記錄\n"
<<"1.通過姓名\n"
<<"2.通過電話\n";
char choice[2];
cin.getline(choice,2);
while(true)
{
if(choice[0]!='1' && choice[0]!='2')
{
cout<<"輸入錯誤,重選1-2:";
cin.getline(choice,2);
}
else
break;
}
int type=static_cast<int>(choice[0])-48;
//輸入需要匹配的字元串
if(type==1)
cout<<"請輸入姓名:"<<flush;
else
cout<<"請輸入電話:"<<flush;
char pattern[20];
cin.getline(pattern,20);
int deletedCount=0;
//找到匹配的記錄
Iterator it=findRecord(pattern,type,first());
Iterator it_end=pastEnd();
while(it!=it_end)
{
cout<<"找到一條匹配的記錄:\n";
dispTable();
cout<<(*it)->name<<"\t\t"<<(*it)->tel<<"\n";
cout<<"確定要刪除這條記錄嗎?[Y/N]";
cin.getline(choice,2);
//刪除這條記錄
if(choice[0]!='n' && choice[0]!='N')
{
it=AddressList::removeRecord(it);
deletedCount++;
}
//取下一條匹配的記錄
if(it!=it_end)
it=findRecord(pattern,type,++it);
}
cout<<"一共刪除了"<<deletedCount<<"條記錄\n"
<<"現在還有"<<size()<<"條記錄"<<endl;
if(deletedCount!=0)
isModified=false;
}

//功能:將通信錄保存至指定文件
//注意:該函數重載了基類中的函數
void AddressBook::saveRecords()
{
if(empty())
{
cout<<"沒有記錄可存!"<<endl;
return;
}
//因為下面的程序中使用string類的成員函數,所以需要進行一次轉換
string fname;
char name[16];
cout<<"請輸入要存在的文件名(直接回車選擇文件sname):";
cin.getline(name,16);
fname=name;
if(fname.empty())
fname="sname";
ofstream of(fname.c_str(),ios_base::out);
if(!of)
{
cout<<"不能存入文件!"<<endl;
return;
}
AddressList::saveRecords(of);
of.close();
cout<<size()<<"條記錄已經存入文件,請繼續操作。"<<endl;
isModified=false;
}
//功能:從指定文件讀取記錄追加到當前通信錄末尾
//注意:該函數重載了基類中的函數
void AddressBook::loadRecords()
{

}
void AddressBook::quit()
{

}

#ifndef H_ADDRESSBOOK_H_NNN
#define H_ADDRESSBOOK_H_NNN
#include "addressList.h"

//處理通信錄操作的面向用戶使用的類,包含所有功能的用戶界面及用戶交互的實現
class AddressBook :public AddressList
{
protected:
bool isModified; //通信錄是否已被修改還未保存
public:
AddressBook();
virtual ~AddressBook();

//開始通信錄的用戶界面操作
virtual void start();
//菜單處理函數
virtual void handleMenu();
//顯示記錄
virtual void displayRecords();
//查詢記錄
virtual void queryRecord();
//增加記錄
virtual void addRecord();
//刪除記錄
virtual void removeRecord();
//保存記錄
virtual void saveRecords();
//讀取記錄
virtual void loadRecords();
//結束程序
virtual void quit();
//清空當前通信錄
virtual void clear();
protected:
//菜單選擇函數
char menuSelect();
//顯示表頭
void dispTable();
};
#endif //H_ADDRESSBOOK_HZ-NNN

#include "addressList.h"
AddressList::~AddressList()
{
recList.clear();
}
//功能:向通信錄中添加新的記錄
//參數:rec,指向新記錄的指針
void AddressList::addRecord (Record* rec)
{
if (rec !=NULL)
{
recList.push_back(rec);
}
}
//功能:從通訊錄中刪除一個記錄
//參數:it,指向欲刪除記錄的迭代器
//注意:it,應是可提領的迭代器,可以通過findRecord()獲得
AddressList::Iterator AddressList::removeRecord(AddressList::Iterator it)
{
return recList.erase(it);
}
//功能:從通信錄中尋找一個記錄
//參數:pattern,欲尋找的記錄的指定域與pattern相等
// type,為1表示欲尋找記錄的名稱(name)與pattern相等;

// 為2表示欲尋找記錄的電弧(tel)與(pattern)相等。
// from,從from開始尋找匹配的記錄。
//返回:若找到了則返回的迭代器指向第一個匹配記錄的迭代器,
// 若找不到則返回的迭代器等於pastEnd()的返回值。
//注意:from應是可提領的迭代器。
// 第一次調用可以用first(),之後使用上一次findRecord()的返回值增1,
// 直到返回pastEnd(),便可以獲得所有匹配的記錄。

AddressList::Iterator AddressList::findRecord(string pattern,int type,AddressList::Iterator from)
{
Iterator it;
Iterator it_end=recList.end();
for (it=from; it!=it_end; it++)
{
if ((type==1 && (*it)->name==pattern)||(type==2 && (*it)->tel==pattern))
break;
}
return it;
}

//功能:將通信錄保存到輸出流中
//參數:os.指定的輸出流
void AddressList::saveRecords(ostream &os)
{
os << recList;
}
//功能:從輸入流中讀入數據並追加到當前通信錄的末尾
//參數:is,指定的輸入流
//返回:讀入的記錄數
int AddressList::loadRecords(istream &is)
{
int ori =size();
is >> recList;
return size()-ori;
}

#ifndef H_ADDRESSLIST_H_AAA
#define H_ADDRESSLIST_H_AAA

#include <iostream>
#include <string>
#include "address.h"

using namespace std;

//處理通信錄操作的底層類,包括增加記錄、刪
//除記錄、查詢記錄以及保存和讀取記錄的函數,
//該類不涉及任何關於用戶界面的操作
class AddressList
{
protected:
RecordList recList;// 使用對象成員作為數據成員
public:
typedef RecordList::iterator Iterator;
//向通信錄中添加新的記錄
virtual void addRecord(Record* rec);
//從通信錄中刪除一個記錄
virtual Iterator removeRecord(Iterator it);
//從通訊錄中尋找一個記錄
virtual Iterator findRecord(string pattern,int type,Iterator from);
//將通信錄保存到輸出流中
virtual void saveRecords(ostream& os);
//從輸入流中讀入數據並追加到當前通信錄的末尾
virtual int loadRecords(istream& is);
virtual ~AddressList();
//獲得通信錄中存儲的記錄數
const int size() const {return (int)recList.size();}
//通信錄是否為空
const bool empty() const {return recList.empty();}
//清除通信錄
virtual void clear() {recList.clear();}
//獲得通信錄的第一條記錄
Iterator first(){return recList.begin();}
//獲得通信錄超過最後一個記錄之後的迭代器
Iterator pastEnd() {return recList.end();}
};
#endif //H_ADDRESSLIST_H_AAA