簡體   English   中英

列出二維 arrays 和迭代器 c++

[英]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 個解決方案

  • 使用 C++ std::array並使用迭代器做所有事情
  • 使用 C 樣式數組並使用索引運算符
  • 使用 C 樣式數組並使用指針,類似於迭代器

我們將從后到尾填寫 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM