ฉันมีรายการ:
list<Object> myList;
myList.push_back(Object myObject);
ฉันไม่แน่ใจ แต่ฉันมั่นใจว่านี่จะเป็นองค์ประกอบ "0" ในอาร์เรย์ มีฟังก์ชันใดบ้างที่ฉันสามารถใช้ที่จะส่งคืน "myObject"?
Object copy = myList.find_element(0);
เหรอ?
ฉันมีรายการ:
list<Object> myList;
myList.push_back(Object myObject);
ฉันไม่แน่ใจ แต่ฉันมั่นใจว่านี่จะเป็นองค์ประกอบ "0" ในอาร์เรย์ มีฟังก์ชันใดบ้างที่ฉันสามารถใช้ที่จะส่งคืน "myObject"?
Object copy = myList.find_element(0);
เหรอ?
front()
การใช้งาน
คำตอบ:
หากคุณจำเป็นต้องเข้าถึงองค์ประกอบ N ของลำดับstd::list
ซึ่งถูกนำมาใช้เป็นรายการที่เชื่อมโยงแบบทวีคูณบ่อยครั้งอาจไม่ใช่ทางเลือกที่ถูกต้อง std::vector
หรือstd::deque
น่าจะดีกว่า
ที่กล่าวว่าคุณสามารถรับตัววนซ้ำไปยังองค์ประกอบ Nth โดยใช้std::advance
:
std::list<Object> l;
// add elements to list 'l'...
unsigned N = /* index of the element you want to retrieve */;
if (l.size() > N)
{
std::list<Object>::iterator it = l.begin();
std::advance(it, N);
// 'it' points to the element at index 'N'
}
สำหรับภาชนะที่ไม่ได้ให้การเข้าถึงแบบสุ่มเช่นstd::list
, std::advance
เรียกร้องoperator++
ในการทำซ้ำโดยN
ครั้ง อีกวิธีหนึ่งหากการใช้งาน Standard Library ของคุณมีให้คุณสามารถโทรstd::next
:
if (l.size() > N)
{
std::list<Object>::iterator it = std::next(l.begin(), N);
}
std::next
มีประสิทธิภาพในการปิดการโทรstd::advance
ทำให้ง่ายต่อการเลื่อนN
เวลาตัววนซ้ำโดยมีบรรทัดโค้ดน้อยลงและตัวแปรที่เปลี่ยนแปลงน้อยลง std::next
ถูกเพิ่มใน C ++ 11
std::advance
หรือstd::next
เรียกใช้ UB ได้ง่าย ไม่มีการตรวจสอบขอบเขต
std::list
ไม่มีฟังก์ชันใด ๆ ในการรับองค์ประกอบที่ได้รับดัชนี คุณอาจลองใช้มันโดยเขียนโค้ดซึ่งฉันไม่แนะนำเพราะมันจะไม่มีประสิทธิภาพถ้าคุณต้องทำบ่อยๆ
สิ่งที่คุณต้องการคือ: std::vector
. ใช้เป็น:
std::vector<Object> objects;
objects.push_back(myObject);
Object const & x = objects[0]; //index isn't checked
Object const & y = objects.at(0); //index is checked
std::list<Object> l;
std::list<Object>::iterator ptr;
int i;
for( i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++ );
if( ptr == l.end() ) {
// list too short
} else {
// 'ptr' points to N-th element of list
}
อาจจะไม่ใช่วิธีที่มีประสิทธิภาพสูงสุด แต่คุณสามารถแปลงรายการเป็นเวกเตอร์ได้
#include <list>
#include <vector>
list<Object> myList;
vector<Object> myVector(myList.begin(), myList.end());
จากนั้นเข้าถึงเวกเตอร์โดยใช้ตัวดำเนินการ [x]
auto x = MyVector[0];
คุณสามารถใส่ไว้ในฟังก์ชันตัวช่วย:
#include <memory>
#include <vector>
#include <list>
template<class T>
shared_ptr<vector<T>>
ListToVector(list<T> List) {
shared_ptr<vector<T>> Vector {
new vector<string>(List.begin(), List.end()) }
return Vector;
}
จากนั้นใช้ funciton ตัวช่วยดังนี้:
auto MyVector = ListToVector(Object);
auto x = MyVector[0];
vector
แทน