การเริ่มต้น std :: vector สองมิติ


116

ดังนั้นฉันมีสิ่งต่อไปนี้:

std::vector< std::vector <int> > fog;

และฉันกำลังเริ่มต้นมันอย่างไร้เดียงสาเช่น:

    for(int i=0; i<A_NUMBER; i++)
    {
            std::vector <int> fogRow;
            for(int j=0; j<OTHER_NUMBER; j++)
            {
                 fogRow.push_back( 0 );
            }
            fog.push_back(fogRow);
    }

และรู้สึกผิดมาก ... มีวิธีการเริ่มต้นเวกเตอร์แบบนี้อีกหรือไม่?


4
ฉันอยากจะแนะนำการใช้งานเวกเตอร์ 1D สำหรับเวกเตอร์ 2d std::vector<int>::max_size()ถ้าคุณไม่จำเป็นต้องใช้พื้นที่มากกว่า ที่นี่
Andre

คงจะดีไม่น้อยหากคำตอบอย่างน้อยหนึ่งคำตอบไม่เกี่ยวข้องกับการคัดลอกเวกเตอร์ด้านใน: memset เร็วกว่า memcpy (และ calloc จะดีกว่าถ้าตัวดำเนินการใหม่ได้รับการอินไลน์)
Marc Glisse

คำตอบ:


199

ใช้ตัวstd::vector::vector(count, value)สร้างที่ยอมรับขนาดเริ่มต้นและค่าเริ่มต้น:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value

ถ้าค่าอื่นที่ไม่ใช่ศูนย์4เช่นต้องเป็นค่าเริ่มต้นแล้ว:

std::vector<std::vector<int> > fog(
    A_NUMBER,
    std::vector<int>(OTHER_NUMBER, 4));

ฉันควรพูดถึงการเริ่มต้นอย่างสม่ำเสมอใน C ++ 11 ซึ่งอนุญาตให้เริ่มต้นvectorและคอนเทนเนอร์อื่น ๆ โดยใช้{}:

std::vector<std::vector<int> > fog { { 1, 1, 1 },
                                    { 2, 2, 2 } };

จะเกิดอะไรขึ้นถ้าฉันสร้างคลาสพื้นที่เก็บข้อมูลของstd :: vector <std :: vector <int>>as static?
strikersps

40

สมมติว่าคุณต้องการเริ่มต้นเวกเตอร์ 2 มิติ m * n โดยให้ค่าเริ่มต้นเป็น 0

เราทำได้

#include<iostream>
int main(){ 
    int m = 2, n = 5;

    vector<vector<int>> vec(m, vector<int> (n, 0));

    return 0;
}

เพิ่งได้รับ 'คำตอบที่ดี' เพราะคำตอบนี้ คนอื่น ๆ ก็ให้คำตอบเดียวกันแล้ว แต่คนที่โหวตคนนี้อาจจะคล้ายกับฉันตอนที่ฉันมาที่โพสต์นี้ซึ่งเราไม่ทราบว่าคำตอบอื่น ๆ เป็นคำตอบเดียวกัน ฉันคิดว่าอาจเป็นเพราะเหตุผลสามประการ: 1) รหัสนี้สามารถคัดลอกวางและรันได้ทันที 2) std::ทำให้ยาวขึ้นและผู้คนอาจชอบคำตอบที่สั้นและตรงประเด็น 3) การตั้งชื่อตัวแปรแบบยาวทำให้ผู้เริ่มต้นสับสน ฉันก็เป็นมือใหม่เหมือนกันไม่รู้ว่าเราต้องการความสำคัญแค่ไหนstd::ต้องการโค้ดที่รันได้ดังนั้นฉันจึงรู้ว่าตัวแปรแต่ละตัวทำหน้าที่อะไร
Jason

35

ไม่มีappendวิธีการใดstd::vectorๆ แต่ถ้าคุณต้องการสร้างเวกเตอร์ที่มีA_NUMBERเวกเตอร์ของintแต่ละตัวที่มีother_numberเลขศูนย์คุณสามารถทำได้:

std::vector<std::vector<int>> fog(A_NUMBER, std::vector<int>(OTHER_NUMBER));

8

ไวยากรณ์ทั่วไปตามที่แสดงไว้แล้วคือ:

std::vector<std::vector<int> > v (A_NUMBER, std::vector <int> (OTHER_NUMBER, DEFAULT_VALUE))  

ที่นี่เวกเตอร์ 'v' สามารถมองเห็นเป็นอาร์เรย์สองมิติโดยมีแถว "A_NUMBER" โดยมีคอลัมน์ "OTHER_NUMBER" ที่มีค่าเริ่มต้นเป็น "DEFAULT_VALUE"

นอกจากนี้ยังสามารถเขียนได้ดังนี้:

std::vector <int> line(OTHER_NUMBER, DEFAULT_VALUE)
std::vector<std::vector<int> > v(A_NUMBER, line)

การป้อนค่าในเวกเตอร์ 2 มิติคล้ายกับการป้อนค่าในอาร์เรย์ 2 มิติ:

for(int i = 0; i < A_NUMBER; i++) {
     for(int j = 0; j < OTHER_NUMBER; j++) {
         std::cin >> v[i][j]
     }
}

มีการระบุตัวอย่างไว้ในคำตอบอื่น ๆ แล้ว .... !


3

ฉันคิดว่าวิธีที่ง่ายที่สุดในการทำให้เสร็จคือ:

std::vector<std::vector<int>>v(10,std::vector<int>(11,100));

10 คือขนาดของเวกเตอร์ภายนอกหรือโกลบอลซึ่งเป็นขนาดหลักและ 11 คือขนาดของเวกเตอร์ภายในของประเภท int และค่าเริ่มต้นจะเริ่มต้นเป็น 100! นั่นเป็นความช่วยเหลือแรกของฉันในกองฉันคิดว่ามันช่วยใครบางคน


2

สมมติว่าคุณต้องการเริ่มต้นเวกเตอร์จำนวนเต็มสองมิติโดยมี n แถวและคอลัมน์ m แต่ละค่ามีค่า " VAL "

เขียนเป็น

std::vector<vector<int>> arr(n, vector<int>(m,VAL));

VAL นี้สามารถเป็นตัวแปรประเภทจำนวนเต็มหรือค่าคงที่เช่น 100


1

แนวทางที่แนะนำคือการใช้ตัวสร้างการเติมเพื่อเริ่มต้นเวกเตอร์สองมิติด้วยค่าเริ่มต้นที่กำหนด:

std::vector<std::vector<int>> fog(M, std::vector<int>(N, default_value));

โดยที่ M และ N คือมิติสำหรับเวกเตอร์ 2 มิติของคุณ


1

c++ STLรหัสของฉันเพื่อเริ่มต้น5*3 2-D vectorด้วยzero


#include <iostream>
using namespace std;
#include <vector>
int main()
{// if we wnt to initialise a 2 D vector with 0;

    vector<vector<int>> v1(5, vector<int>(3,0));

    for(int i=0;i<v1.size();i++) 
{
        for(int j=0;j<v1[i].size();j++)

           cout<<v1[i][j]<<" ";

            cout<<endl;
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.