SORU
25 Mayıs 2012, Cuma


C bir vektör içeriğini yazdırmak

Ben ne burada C: Bir dizinin içeriğini yazdırmak istiyorum

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <vector>
#include <sstream>
#include <cstdio>
using namespace std;

int main()
{
    std::ifstream file("maze.txt");
    if (file) {
        std::vector<char> vec(std::istreambuf_iterator<char>(file), (std::istreambuf_iterator<char>()));
        vector<char> path;
        int x = 17;
        char entrance = vec.at(16);
        char firstsquare = vec.at(x);
        if (entrance == 'S') { 
            path.push_back(entrance); 
        }
        for (x = 17; isalpha(firstsquare); x  ) {
            path.push_back(firstsquare);
        }
        for ( int i = 0; i < path.size(); i  ) {
            cout << path[i] << " ";
        }
        cout << endl;
        return 0;
    }
}

Nasıl ekran vektör içeriğini yazdırabilirim?

CEVAP
25 Mayıs 2012, Cuma


Sadece sorunuzu yanıtlamak için, bir yineleyici kullanabilirsiniz:

std::vector<char> path;
// ...
for (std::vector<char>::const_iterator i = path.begin(); i != path.end();   i)
    std::cout << *i << ' ';

Eğer döngü içinde vektör içeriği değiştirmek istiyorsanız, o zaman iterator yerine const_iterator kullanın.

Ama bu konuda söylenebilecek çok fazla şey var. Eğer sen kullanabilirsiniz bir cevap istiyorsanız, o zaman burada dur; aksi halde, okumaya devam edebilirsiniz.

(C 11) otomatik/typedef

Bu bir çözüm değil, ama iterator yukarıdaki çözüm olan bir sistemdir. Eğer C 11 standart (veya üstü) kullanıyorsanız, auto anahtar okunabilirlik yardımcı olmak için kullanabilirsiniz:

for (auto i = path.begin(); i != path.end();   i)
    std::cout << *i << ' ';

Ama i türü olmayan sabit (yani, i türü std::vector<char>::iterator kullanacak derleyici) olacaktır.

Bu durumda, sadece typedef (C 11 ve sınırlı değil . kullanabilirsiniz ^strong>çokneyse kullanın) yararlı:

typedef std::vector<char> Path;
Path path;
// ...
for (Path::const_iterator i = path.begin(); i != path.end();   i)
    std::cout << *i << ' ';

sayaç

Tabii ki, for döngü içinde konumunuzu kaydetmek için bir tamsayı türünü kullanabilirsiniz:

for(int i=0; i<path.size();   i)
  std::cout << path[i] << ' ';

Eğer bunu yapmak için gidiyoruz eğer varsa ve uygun olursa daha iyi konteynerin üyesi türleri kullanın. Bu iş için bir üye size_type denilen türü vardır std::vector: türü size Bu yöntem tarafından döndürülür.

// Path typedef'd to std::vector<char>
for( Path::size_type i=0; i<path.size();   i)
  std::cout << path[i] << ' ';

Neden sadece iterator çözüm üzerinde bu kullanmak değil mi? Basit durumlar için de olabilir, ama noktası iterator sınıfı bir nesne bu çözüm ideal olmayacak yerde daha karmaşık nesneler için bu işi yapmak için tasarlanmıştır.

loop (C 11) aralığı tabanlı

Jefffrey's solution bkz. C 11 (ve daha sonra) yeni range tabanlı kullanabilirsiniz bu gibi görünüyor for döngü:

for (auto i: path)
  std::cout << i << ' ';

Beri path bir vektör öğeleri (açıkça std::vector<char>), nesne i türünden öğesi vektör (yani, açıkça, bu tür char). 37* *nesne path nesne gerçek öğenin bir kopyası olan bir değeri vardır. Böylece döngü i tüm değişiklikleri path kendisi korunmaz. Ayrıca, eğer gidiyor zorlamak aslında sen olmak istemiyorum mümkün değiştirmek için kopyalanan değeri i döngü, kuvvet türü i const char: bunun gibi

for (const auto i: path)
  std::cout << i << ' ';

Eğer path, öğeleri değiştirmek için bir başvuru kullanabilirsiniz:

for (auto& i: path)
  std::cout << i << ' ';

ve eğer varsa nesnelerin kopyalanması pahalı ise path değiştirmek istemezsin bile değeri kopyalamak yerine, sabit bir referans kullanmanız gerekir:

for (const auto& i: path)
  std::cout << i << ' ';

::std kopyalayın

Joshua's answer bkz. STL algoritması std::copy vektör içeriğini kopyalamak için çıkış akışı üzerine kullanabilirsiniz. Eğer rahat iseniz, o başka. (ve zarif bir çözümçokyararlı değil, sadece bir vektör içeriğini yazdırma bu durumda).

::for_each std

Max's solution bkz. std::for_each bu basit senaryo için abartılı olur, ama eğer ekran için sadece baskı daha yapmak istersen çok yararlı bir çözüm kullanarak: std::for_each kullanarak yapmanızı sağlarherhangi bir(mantıklı) vektör içeriğini işlemi.

aşırı başka::operator<<

** 63, bunu görmek daha hala çözümlerden biri aşırı yukarıda uygulamak gerekir beri diğer cevaplar için tamamlayıcıdır. Onun örnek for bir döngü içinde bir sayaç kullandı. Örneğin, bu hızlı Joshua's solution kullanabilirsiniz:

template <typename T>
std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
  if ( !v.empty() ) {
    out << '[';
    std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
    out << "\b\b]";
  }
  return out;
}

Diğer çözümleri kullanımı kolay olmalı.

sonuç

Çözümler burada sunulan herhangi bir iş olacaktır. Bu size kalmış ve kod "" en iyi Her şeyi daha ayrıntılı daha bu muhtemelen en iyi sol için başka bir soru nerede artı/eksi olabilir doğru olarak değerlendirildiği; ancak her zaman olduğu gibi kullanıcı tercihi olacak her zaman oynadığım rol: hiçbiri çözümler sunulmaktadır yanlış, ama bazı olacak bak daha güzel her bir kodlayıcı.

ek

Bu yayınlanan bir önceki, genişletilmiş bir çözümdür. Bu post ilgiyi sürekli üzerinde genişletmeye karar verdim ve burada yayınlanan diğer mükemmel çözümlere bakın. Benim orijinal sonrası eğer bahsettiğiniz gibi bir açıklama vardıedildisözleşmesi değiştirme vektörünü içinde for döngü sonra iki yöntem vardır tarafından sağlanan std::vector erişim elemanları: std::vector::operator[] yapamaz sınırları kontrol, ve std::vector::at mu gerçekleştirmek sınırları kontrol. Diğer bir deyişle, 58 ** vektör dışında bir öğesi erişmeye çalışırsa atar ve operator[] olmazdı. Ben sadece bu yorum, aslında, eğer herkes zaten yapmasaydın mi bilmek yararlı olabilir bir şey söz uğruna ekledi. Ve hiçbir farkı şimdi anlıyorum. Bu ek dolayısıyla.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cosmicrocketman

    cosmicrocket

    17 NİSAN 2006
  • Google Chrome

    Google Chrom

    1 EYLÜL 2008
  • magnum33563

    magnum33563

    8 NİSAN 2011