使用vector(string)C ++

时间:2016-10-06 23:24:07

标签: c++ arrays string vector

我有阵列masiv_C0 = {{AB,ADF},{BC,ADF},{CD,BC},{DE,ADF}}

我有阵列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; }

1 个答案:

答案 0 :(得分: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>>一起使用,vector的{​​{1}}也应该是外部的,并且会影响性​​能的要求。