【问题标题】:How do I access elements of multiset within a vector in the format "vector<multiset<char> vp;"?如何访问格式为 \"vector<multiset<char> vp;\" 的向量中的 multiset 元素?
【发布时间】:2022-11-26 23:47:51
【问题描述】:

我正在创建一个程序,它以 vector<multisetvp; 的形式接收 multiset 中的值。当它的个数变为 5 时,将其存储在向量内部的 multiset 中。如果你存储从 1 到 10 的值,当你打印出向量时, 1 2 3 4 5 6 7 8 9 10 我希望它像这样出来。

但是,很难将存储在向量内部的 multiset 中的值输出。寻求有关如何解决此问题的帮助。

我还尝试使用重叠的“基于范围的 for 语句”来输出“sp”的值,但它最终只输出了一个向量的多集。我想存储和输出向量中最多包含五个元素的多重集。

#include <iostream>
#include <set>
#include <vector>
#include <array>

using namespace std;

class MyCharector {
    vector<multiset<char>> vp;
    vector<multiset<char>>::iterator vit;
    multiset<char>* sp;
    multiset<char>::iterator sit;
public:
    ~MyCharector() {  }

    void ininven(multiset<char> s) {
        vp.push_back(s);
    }

    void getItem(char* item) {
        sp = new multiset<char>;
        for (int i = 0; i < 10; i++) {
            sp->insert(item[i]);
            if (sp->size() == 5) {
                ininven(*sp);
            }
        }
        delete sp;
    }
    void dropItem() { // is not use
        vit = vp.begin();
        vit = vp.erase(vit);
    }
    void showItem() { 

        for (vit = vp.begin(); vit != vp.end(); vit++) {
            // problems.....
        }
    }
};

int main(int argc, const char* argv[]) {
    MyCharector my;

    array<char,10> item = { 'a','a','e','d','g','f','c','c','h','b' };
    
    my.getItem(item.data());

    my.showItem();

    
    return 0;
}




【问题讨论】:

  • newdelete 与STL 容器(如new multiset&lt;char&gt;)一起使用不应该是您的第一选择。
  • 那么,如果我不使用它,还有其他方法吗?

标签: c++ c++11


【解决方案1】:

当然你可以让它与迭代器一起工作,但是简单的基于范围的循环有什么问题呢?

for (const auto& ms : vp)
    for (char c : ms)
        cout << c;

另外为什么在getItem中使用newdelete?为什么应该使用局部变量时声明类变量?

void getItem(char* item) {
    multiset<char> sp;
    for (int i = 0; i < 10; i++) {
        sp.insert(item[i]);
        if (sp.size() == 5) {
            ininven(sp);
        }
    }
}

sp不需要是指针,应该是局部变量。

编辑

我也认为 getItem 有一个错误。我猜你想要每五个字符一个新的多重集,但这不是代码的作用。也许这就是你想要的

void getItem(char* item) {
    multiset<char> sp;
    for (int i = 0; i < 10; i++) {
        sp.insert(item[i]);
        if (sp.size() == 5) {
            ininven(sp);
            sp.clear(); // start again
        }
    }
}

【讨论】:

  • 好吧,输出有点奇怪,但是打印“aadeg”是对的吗?还是我需要再修改一些东西?谢谢您的回答
  • @Hys 我不知道什么是对的。你在期待什么?
  • 太感谢了 :)
  • 我想要的输出是 a a b c c ' ' d e f g h 很抱歉打扰你。
  • @Hys 我想我看到了问题,我会更新答案
猜你喜欢
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2012-03-05
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 2021-12-01
相关资源
最近更新 更多