ฉันมีรายการ:
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แทน