2014-04-08 46 views
0

我有2D矢量(vector<vector<string>>)與很多列(m * n)(這裏我提到這個2D矢量作爲Maintable)。我想創建一個具有主表中幾個特定列的新向量。 例如,假設如果我有一個包含12列的主表,我想將主表中的任何3個非連續列轉換爲新的2D向量。怎麼做?如何創建一個新的矢量與特定的列從現有的2D矢量在C++

+0

請分享定義,我不知道你怎麼那些*列*在'STD得到表示: :vector'(因爲是'std :: vector',是嗎?) – jsantander

+0

什麼是2D矢量? –

+0

如果你有選擇,使用'std :: slice'和'std :: valarray'這樣的操作會容易得多。如果沒有,請考慮讓你的數據是一個單一的'std :: vector ',然後你可以簡單地使用一些簡單的索引數學來表現它,就好像它是一個2D矩陣。 – Edward

回答

0

您可以使用的東西,如下

#include <iostream> 
#include <string> 
#include <vector> 
#include <iterator> 

//... 

const size_t N = 10; 
std::string a[] = { "A", "B", "C", "D", "E", "F" }; 
std::vector<std::vector<std::string>> v1(N, std::vector<std::string>(std::begin(a), std::end(a))); 
std::vector<std::vector<std::string>> v2; 

v2.reserve(v1.size()); 

for (const std::vector<std::string> &v : v1) 
{ 
    v2.push_back(std::vector<std::string>(std::next(v.begin(), 2), std::next(v.begin(), 5))); 
} 

for (const std::vector<std::string> &v : v2) 
{ 
    for (const std::string &s : v) std::cout << s << ' '; 
    std::cout << std::endl; 
} 

它是簡單重寫使用C++的語法2003的代碼。例如,你可以寫

std::vector<std::vector<std::string>> v1(N, 
              std::vector<std::string>(a, a + sizeof(a)/sizeof(*a))); 

,而不是

std::vector<std::vector<std::string>> v1(N, std::vector<std::string>(std::begin(a), std::end(a))); 

等。

編輯:如果列不相鄰,那麼你可以用下面的辦法

#include <iostream> 
#include <vector> 
#include <array> 
#include <string> 
#include <iterator> 
#include <algorithm> 


int main() 
{ 
    const size_t N = 10; 
    const size_t M = 3; 

    std::string a[N] = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" }; 
    std::vector<std::vector<std::string>> v1(N, std::vector<std::string>(std::begin(a), std::end(a))); 
    std::vector<std::vector<std::string>> v2; 

    v2.reserve(v1.size()); 

    std::array<std::vector<std::string>::size_type, M> indices = { 2, 5, 6 }; 

    for (const std::vector<std::string> &v : v1) 
    { 
     std::vector<std::string> tmp(M); 
     std::transform(indices.begin(), indices.end(), tmp.begin(), 
      [&](std::vector<std::string>::size_type i) { return (v[i]); }); 
     v2.push_back(tmp); 
    } 

    for (const std::vector<std::string> &v : v2) 
    { 
     for (const std::string &s : v) std::cout << s << ' '; 
     std::cout << std::endl; 
    } 
} 
+0

只需添加,此語法是C++ 11 – Lefsler

+0

感謝您的回覆。這個程序即將獲得列的序列。我的任務是獲得非連續的列。從10列矢量表中,我想要第2,第5,第6列。 – user3475204

+0

@ user3475204查看我更新的帖子。 –