[英]Lists to 2D arrays and iterators c++
我想獲取 std 列表的內容並通過迭代器將它們傳遞給 2x10 數組,它應該從元素 [2][10] 開始
@Suthiro 非常友好地提供了適用於從元素 [0][0] 向前移動的元素的代碼。
auto jj = 1u;
while (!condition)
{
intarray[0][0] = *it;
++it;
for (auto ii=jj; ii >= 1 ; --ii)
intarray[0][ii] = intarray[0][ii-1];
++jj;
}
所以我嘗試了所有可能的變化
我想我得到的最接近的是這里的這件作品。
FileList = List;
auto jj = 1;
it = begin(FileList);
std::advance(it, 10);
for (auto& i : FileList) {
FileArray[1][9] = *it;
++it;
for (auto ii = 19; ii>=1; --ii)
{
FileArray[0][ii - 1] = FileArray[0][ii];
++jj;
}
我已經通過斷點嘗試解決它,但經過很多小時后,我正在尋求一些幫助。
好的,據我了解,您想將std::list
中的值分配給二維數組。 我希望您的意思是std::array
而不是不應在 C++ 中使用的 C 樣式數組。
但是,我擔心您的意思是 C 樣式數組。
無論如何,我將向您展示 3 個解決方案
std::array
並使用迭代器做所有事情我們將從后到尾填寫 arrays。
使用 C++ 迭代器,這非常簡單,因為我們可以使用所謂的reverse_iterator
。 如果你用rbegin()
初始化它,那么它將指向最后一個元素。 將其遞增 (++) 實際上會將 go 增加到前一個元素。
所以,一個非常優雅的解決方案。
請參見:
#include <iostream>
#include <list>
#include <array>
#include <numeric>
// The dimensions and size for our array
constexpr size_t NumberOfRows = 2U;
constexpr size_t NumberOfColumns = 10U;
int main() {
// This is our std::list.
std::list<int> myList;
// Fill the list with some demo values
myList.resize(NumberOfRows * NumberOfColumns);
std::iota(myList.begin(), myList.end(), 0);
// -------------------------------------------------------------
// This is the solution for a C++ std::list and a C++ std::array
// Get an iterator to the begin of the list
std::list<int>::iterator listIterator = myList.begin();
// This is a 2 dimensional std::array with 2 rows and 10 columns
std::array<std::array<int, NumberOfColumns>, NumberOfRows> myArray;
// This is an iterator with which we can iterate over the rows in our target array.
// Since we ant to iterate from end to begin, we use an reverse iterator
std::array<std::array<int, NumberOfColumns>, NumberOfRows>::reverse_iterator arrayRowIterator;
// Iterate over the rows beginning from rbegin(), so, from the end
for (arrayRowIterator = myArray.rbegin(); arrayRowIterator != myArray.rend(); ++arrayRowIterator) {
// This is an iterator with which we can iterate over the columns in our target array.
// Since we want to iterate from end to begin, we use an reverse iterator
std::array<int, NumberOfColumns>::reverse_iterator arrayColumnIterator;
// Iterate over the columns beginning from rbegin(), so, from the end
for (arrayColumnIterator = arrayRowIterator->rbegin(); arrayColumnIterator != arrayRowIterator->rend(); ++arrayColumnIterator) {
// Assign the value
*arrayColumnIterator = *listIterator;
// Point to next value in the list
++listIterator;
}
}
// Show debug output
for (size_t row = 0; row < NumberOfRows; ++row) {
for (size_t column = 0; column < NumberOfColumns; ++column) {
std::cout << myArray[row][column] << " ";
}
std::cout << "\n";
}
// --------------------------------------------------------------------------------------
// If you use a C-Style array, what I fear then you can use the following simple approach
// Define 2 dimensional C-Style array
int myCStyleArray[NumberOfRows][NumberOfColumns];
// Reset the iterator back to the list begin
listIterator = myList.begin();
// Iterate ove the C-Style array from end to begin
for (int row = NumberOfRows - 1; row >= 0; --row) {
for (int column = NumberOfColumns - 1; column >= 0; --column) {
myCStyleArray[row][column] = *listIterator;
++listIterator;
}
}
// Show debug output
for (size_t row = 0; row < NumberOfRows; ++row) {
for (size_t column = 0; column < NumberOfColumns; ++column) {
std::cout << myCStyleArray[row][column] << " ";
}
std::cout << "\n";
}
// -----------------------------------------------------------------------------------
// This is the solution for a C++ std::list C-Style array, using pointers as iterators
// If you check carefully, then you will se the similarity with pointers
// Define 2 dimensional C-Style array
int myCStyleArray2[NumberOfRows][NumberOfColumns];
// Reset the iterator back to the list begin
listIterator = myList.begin();
// Define a pointer to an int[10]. Please note: In C++ you cannot use an int**
int(*cStyleArrayRowIterator)[NumberOfColumns];
// Iterate over the rows
for (cStyleArrayRowIterator = myCStyleArray2 + NumberOfRows - 1; cStyleArrayRowIterator >= myCStyleArray2; --cStyleArrayRowIterator) {
int* cStyleArrayColumnIterator;
// Iterator over the columns
for (cStyleArrayColumnIterator = *cStyleArrayRowIterator + NumberOfColumns - 1; cStyleArrayColumnIterator >= *cStyleArrayRowIterator; --cStyleArrayColumnIterator) {
// Assign the values
*cStyleArrayColumnIterator = *listIterator;
++listIterator;
}
}
// Show debug output
for (size_t row = 0; row < NumberOfRows; ++row) {
for (size_t column = 0; column < NumberOfColumns; ++column) {
std::cout << myCStyleArray[row][column] << " ";
}
std::cout << "\n";
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.