2012-10-02 52 views
1

我自己學習C++,因此我在一些領域有一些空白頁面,例如。對容器的一些操作,不同操作的名稱等。 因此請幫助我解決這個問題。我也很感謝給我發送好的資源,這將幫助我選擇正確的容器和方法來處理它們。真正的實現例子將會有很大的幫助,因爲用這種方式可以更容易地獲得它。)如何處理矢量以獲得所需的輸出?

This是我第一個'真正'的節目。我在PHP中創建了它,但現在我重新學習C++(我可以說它更具挑戰性)。

簡而言之,讀取文件並創建3個不同的載體,其中包含相應的元素(人名,物品名稱和物品數量)。 因此,例如,(我知道這不是分配價值的方式,它只是說明內容):

vector<string> vectorOfNames = {"Adam", "Eva", "Adam", "Adam", "Bruce"}; 
vector<string> vectorOfItems = {"Apple", "Apple", "Orange", "Pear", "Melon"}; 
vector<int> vectorOfAmount = {1, 9, 2, 4, 1}; 

現在,我想(通過個人和項目)來表示它和count(按金額)的載體,例如。打印如下:

All persons: 
Adam 
Eva 
Bruce 

All items: 
Apple - 10 
Orange - 2 
Pear - 4 
Melon - 1 

Adam have: 
Apple - 1 
Orange - 2 
Pear - 4 

Eva have: 
Apple - 9 

Bruce have: 
Melon - 1 

在PHP中我使用* array_keys(array_flip())*來獲取唯一的名稱和項目。 在C++中,我發現這樣的事情:

vector<string>::iterator r , w ; 

set<string> tmpset ; 

for(r = vectorOfNames.begin() , w = vectorOfNames.begin() ; r != vectorOfNames.end() ; ++r) 
{ 
    if(tmpset.insert(*r).second) 
    { 
     *w++ = *r ; 
    } 
} 

vectorOfNames.erase(w , vectorOfNames.end()); 

它運作良好,但問題是,它修改原始vectorOfNames。 我應該在複製這個向量之前將這個向量複製到新的向量還是有另一種方法?

至於其餘所需的處理在PHP我使用foreach如果陳述。 我正在嘗試C++的不同方法,但沒有任何工作。我完全失去了...... 另外我知道在Boost Library中有一些功能,但暫時我不想去那裏,更喜歡首先學習基本知識。

另一方面,也許我應該使用其他容器,如地圖或其他東西,使這個處理更容易?

所以,如果你還知道我的意思,你沒睡着,請把我在正確的方向;)

+0

在C++ 11中,'std :: vector v = {val1,val2,val3}'完全沒問題。 :P – Xeo

+0

@Xeo如果你使用的是MSVC :-( – Benj

+0

)對於這個例子,爲什麼不堅持使用一對簡單的地圖呢std :: map user_items; // key是用戶名std :: map item_cost; // key是項目名稱 – Jerdak

回答

3

的第一步,即讓所有的唯一的名稱在std::vector<std::string>我可能會做這樣的:

std::vector<std::string> tmp(original); 
std::sort(tmp.begin(), tmp.end()); 
std::unique_copy(tmp.begin(), tmp.end(), 
       std::ostream_iterator<std::string>(std::cout, "\n")); 

另一種解決方案可以使用輔助std::set<std::string>但排序順序將不打印名稱:

std::set<std::string> mark; 
std::copy_if(original.begin(), original.end(), 
      [&](std::string const& value) { return mark.insert(value); }); 

(利用C++ 2011功能)

其他操作不直接映射到C++算法的工作方式。要處理這些問題,我可能會使用不同的數據佈局,例如將數據存儲在std::vector<std::tuple<std::string, std::string, int> >而不是三個單獨的向量中。

+0

不需要排序結果,可能是因爲它們出現,但它可能是很好的補充。將檢查什麼是hed std :: tuple,並將給它一個嘗試(是的,我是一個新手)。謝謝! – RegEx

+0

那麼,當使用'std :: unique_copy()'時,你需要使用'std :: sort()'ing來實現相同的元素:每一個相同元素序列的一個元素,這就是序列'愛麗絲,愛麗絲,鮑勃,愛麗絲'會產生'愛麗絲,鮑勃,阿里ce'沒有分類。 –

+0

感謝您的額外解釋。你非常有幫助;) – RegEx

0

這並貼近原始的辦法:

vector<string> vs; 
vs.resize(vectorOfNames.size()); // more efficient if we already know the size 

set<string> tmpset ; 

vector<string>::const_iterator r; 
for(r = vectorOfNames.begin() ; r != vectorOfNames.end() ; ++r) 
{ 
    if(tmpset.insert(*r).second) 
    { 
     vs.push_back(*r); 
    } 
} 

但是,它使用一個輔助向量來存儲新的名字,所以你不需要修改原來的載體。爲了保證你不實際修改向量,這種方法使用const_iterator而不是迭代器。