2016-10-06 48 views
0

我有陣列masiv_C0 = {{AB,ADF},{BC,ADF},{CD,BC},{DE,ADF}}與載體(串)工作C++

我有陣列masiv_X0 = { {AB,ADF},{CD,BC},{DE,ADF}}

有必要創建前兩個的第三陣列:

masiv_Y1 = masiv_C0 - masiv_X0 = {{BC,ADF }}

問題是,在我創建的第三個數組中,我刪除了單個元素。

因此,而不是獲得{{BC,ADF}}我得到{{BC}} ...幫助正確的代碼!謝謝:)

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

using namespace std; 

typedef std::vector<std::string> String1D; 
typedef std::vector<String1D> String2D; 

int main() 
{ 
String2D masiv_C0(4, String1D(2)); 
masiv_C0[0][0]="AB"; 
masiv_C0[0][1]="ADF"; 
masiv_C0[1][0]="BC"; 
masiv_C0[1][1]="ADF"; 
masiv_C0[2][0]="CD"; 
masiv_C0[2][1]="BC"; 
masiv_C0[3][0]="DE"; 
masiv_C0[3][1]="ADF"; 

String2D masiv_X0(3, String1D(2)); 
masiv_X0[0][0]="AB"; 
masiv_X0[0][1]="ADF"; 
masiv_X0[0][0]="CD"; 
masiv_X0[0][1]="BC"; 
masiv_X0[0][0]="DE"; 
masiv_X0[0][1]="ADF"; 

String2D masiv_Y1 = masiv_C0; 
for (size_t i = 0; i < masiv_X0.size(); ++i) 
{ 
    for (size_t j = 0; j < masiv_X0[i].size(); ++j) 
    { 
     auto& str = masiv_X0[i][j]; 
     for (size_t cur = 0; cur < masiv_Y1.size(); ++cur) 
     { 
      auto iter = std::remove(masiv_Y1[cur].begin(), masiv_Y1[cur].end(), str); 
      masiv_Y1[cur].erase(iter, masiv_Y1[cur].end()); 
     } 
    } 
} 

String2D::iterator iter = masiv_Y1.begin(); 
while (iter != masiv_Y1.end()) 
{ 
    std::copy((*iter).begin(), (*iter).end(), std::ostream_iterator<std::string>(cout, " ")); 
    cout << "\n"; 
    ++iter; 
} 

return 0; } 
+0

請注意,C和C++是不同的語言。我已經糾正了你。今後請僅使用相關標籤。 – kaylum

+0

正確的答案是啓動您的開發環境的調試器並逐步執行該程序,直到您看到它與預期的偏離。然後使用你可以看到的程序狀態,確定它偏離的原因。建議:如果輸入始終是對,則不要使用vector的'vector',使用'std :: pair'的'vector'。由於局部性的改善,速度要快得多,並且在不破壞事物的情況下移動對可能在概念上更容易。 – user4581301

回答

1

X-Y回答:扔掉你在做什麼。標準庫可以完成您需要爲您做的一切。沒有麻煩。別大驚小怪。

#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() 
{ 
    // shorten this templated nightmare 
    using vecpair = std::vector<std::pair<std::string,std::string>>; 

    // define inputs 
    vecpair masiv_C0{{"AB","ADF"},{"BC","ADF"},{"CD","BC"},{"DE","ADF"}}; 
    vecpair masiv_X0{{"AB","ADF"},{"CD","BC"},{"DE","ADF"}}; 

    // define output 
    vecpair masiv_Y1; 

    // use std library to do the work 
    std::set_difference(masiv_C0.begin(), masiv_C0.end(), 
        masiv_X0.begin(), masiv_X0.end(), 
        std::back_inserter(masiv_Y1)); 

    // print it. 
    for (const std::pair<std::string,std::string> & p: masiv_Y1) 
    { 
     std::cout << "{" << p.first << "," << p.second << "}\n"; 
    } 
    return 0; 
} 

Docs for std::pair

Docs for std::set_difference

Docs for std::back_inserter

編注:

一切,所不同的打印循環應與std::vector<std::vector<std::string>>工作,以及應該是vectorvector是外部的,和性能殺手要求。