2012-03-23 31 views
4
std::vector<std::pair<std::string > > 

可用於存儲一對字符串的列表。有沒有類似的方式來存儲字符串的三元組列表?我能想到的如何存儲三個字符串集合的列表?

一種方法是使用std::vector

std::vector<std::vector<std::string > > v (4, std::vector<std::string> (3)); 

但這不會讓我使用handly firstsecond存取。

所以,我寫我自己的類

#include <iostream> 
#include <vector> 
using namespace std; 

template <class T> 
class triad { 
private: 
    T* one; 
    T* two; 
    T* three; 
public: 
    triad() { one = two = three =0; } 
    triad(triad& t) { 
     one = new T(t.get1()); 
     two = new T(t.get2()); 
     three = new T(t.get3()); 
    } 
    ~triad() { 
     delete one; 
     delete two; 
     delete three; 
     one = 0; 
     two = 0; 
     three = 0; 
    } 
    T& get1() { return *one; } 
    T& get2() { return *two; } 
    T& get3() { return *three; } 
}; 

int main() { 
    std::vector< triad<std::string> > v; 
} 

我有兩個問題

  1. 可以將我的類代碼以任何方式加以改進?
  2. 有沒有比上述三種方式更好地存儲三串字符串的方法?

回答

9

std::tuplestd::pair的概括,它允許您存儲指定大小的集合。所以,你可以說:

typedef std::tuple<std::string, std::string, std::string> Triad; 

得到一個類型Triad,它存儲三個字符串。

+2

'std :: tuple'是C++ 11中的新增功能,但應該在大多數比幾年前更新的編譯器中可用。 – 2012-03-23 07:43:37

3

正如其他人所說,你應該使用std::tuple(或boost::tuple)。不過,我覺得有東西,你可以從你的代碼的批評學:如果你想要像std::pair,你爲什麼不寫的東西表現得像個std::pair

  1. ?也就是說,一個有公共數據成員的類按價值複製它的項目?
  2. 如果你想要類似std::pair的東西,爲什麼不使它更通用,如std::pair,其中不同的成員可以有不同的類型?或者,如果你只關心存儲std::string成員,爲什麼要把它作爲模板類呢?
  3. 您的副本構造函數應該採用const引用的參數。
  4. 您沒有按照Rule of Three。你有一個不平凡的拷貝構造函數和一個非平凡的析構函數,但忽略實現一個拷貝賦值操作符。但是,如果你做了#1,你不需要擔心這一點。
  5. 正如所寫,不可能設置你的班級的數據成員。沒有構造函數使用指定的值初始化它們,並且在構建之後無法設置它們。 (如果你嘗試triad.get1() = ...,你會試圖解引用空指針!)
  6. 你的構造函數應該使用初始化列表初始化它們的數據成員。例如:

    triad() : one(0), two(0), three(0) { }

  7. 之一,使得std::pair有用過簡單地使所希望的部件的struct的事情之一是,它帶有operator==operator<

  8. 如果您確實想使用存取方法,那麼您應該提供const版本。
1

如果你的三元組是特定的,那麼創建一個類或者至少一個結構體,這樣你就可以給成員賦予有意義的名字。

struct Contact 
{ 
    std::string name; 
    std::string nickname; 
    std::string email; 
}; 

std::vector<Contact> contacts; 
相關問題