qt foreach 예제

QMapIterator는 또한 거리에서 직접 작동하고 이터레이터가 위로 점프한 마지막 항목의 키와 값을 반환하는 key() 및 value() 함수를 제공합니다. 예를 들어 다음 코드는 QMap의 내용을 QHash로 복사합니다. 고객 코드에 대한 결정을 강요하는 것은 정말 괜찮지 않습니다. 특정 컨테이너 클래스 함수의 설명서는 기본 생성 값을 참조합니다. 예를 들어 QVector는 기본 생성 값으로 해당 항목을 자동으로 초기화하고 QMap::value()는 지정된 키가 맵에 없는 경우 기본 생성 값을 반환합니다. 대부분의 값 형식의 경우 이는 단순히 기본 생성자(예: QString용 빈 문자열)를 사용하여 값이 생성됨을 의미합니다. 그러나 int 및 double과 같은 기본 형식과 포인터 형식의 경우 C++ 언어는 초기화를 지정하지 않습니다. 이러한 경우 Qt의 컨테이너는 값을 0으로 자동으로 초기화합니다. foreach는 컨테이너의 복사본을 생성하므로 변수에 대한 const가 아닌 참조를 사용하면 원래 컨테이너를 수정할 수 없습니다. 복사본에만 영향을 주므로 원하는 것이 아닐 수 있습니다. 구문은 foreach (변수, 컨테이너) 문입니다.

예를 들어 foreach를 사용하여 QLinkedList 를 반복하는 방법은 다음과 같습니다. 한정을 사용하려면 형식이 기본 생성자, 복사 생성자 및 할당 연산자에게 제공해야 합니다. 여기에는 int 및 double, 포인터 유형 및 QT 데이터 형식(예: QString, QDate 및 QTime)과 같은 기본 형식을 포함하여 컨테이너에 저장할 가능성이 있는 대부분의 데이터 형식을 다루지만 QObject 또는 QObject 하위 클래스(QWidget, QDialog)는 다루지 않습니다. , QTimer 등). QList 인스턴스화하려고 하면 컴파일러가 QWidget의 복사 생성자 및 할당 연산자가 비활성화되어 있다고 불평합니다. 이러한 종류의 개체를 컨테이너에 저장하려면 QList와 같은 포인터로 저장합니다. OCaml은 기능적인 언어입니다. 따라서 foreach 루프와 동등한 목록은 목록 및 배열에 대한 라이브러리 함수로 얻을 수 있습니다.

Ada 2012에는 모든 종류의 컨테이너(배열, 목록, 맵 등)의 각 루프를 위한 일반화 루프가 있습니다. 예를 들어 QLinkedList 중간에 항목을 삽입하는 것은 QLinkedList에 저장된 항목 수에 관계없이 매우 빠른 작업입니다. 반면에 QVector 중간에 항목을 삽입하는 것은 항목의 절반을 메모리에서 한 위치로 이동해야 하므로 QVector에 많은 항목이 포함되어 있는 경우 비용이 많이 듭니다. 복사본 생성자 또는 할당 연산자제공하지 않는 경우 C++는 멤버별 복사본을 수행하는 기본 구현을 제공합니다. 위의 예에서는 충분했을 것입니다. 또한 생성자 제공 하지 않는 경우 C++는 기본 생성자 사용 하 여 해당 멤버를 초기화 하는 기본 생성자 제공 합니다.