【问题标题】:c++: Iterating through a multiset of vectorsc ++:遍历一组向量
【发布时间】:2012-09-03 17:26:57
【问题描述】:

我正在尝试从一组向量中打印出每个向量中的所有元素。构建失败,但错误发生在头文件中的某处,恐怕我根本不了解错误代码。任何帮助将不胜感激!这是错误:

error: invalid conversion from 'const std::basic_string<char, std::char_traits<char>, std::allocator<char> >* const' to 'std::basic_string<char, std::char_traits<char>, std::allocator<char> >*'

这是导致问题的代码。

multiset<vector < string > > setOfRules;
vector<string> testing,testing2;

testing.push_back("bar");
testing.push_back("foo");
testing2.push_back("foo2");
testing2.push_back("bar2");
setOfRules.insert(testing);
setOfRules.insert(testing2);

for (multiset< vector <string > >::iterator myIterator = setOfRules.begin();
     myIterator!=setOfRules.end(); 
     ++myIterator) 
{

    for (vector< string >::iterator myOtherIterator = ( *myIterator ).begin(); 
         myOtherIterator != ( *myIterator ).end(); 
         ++myOtherIterator) 
    {
        cout << *myOtherIterator << " " ;
    }
    cout << endl;
}

【问题讨论】:

  • 我没看到你在哪里添加了testingtesting2setOfRules
  • 同意。 setOfRules 在这段代码中为空。
  • 迭代multiset 需要您使用const_iterator。否则,您可能会尝试在迭代期间更改集合的“键”,这会破坏集合中的顺序。
  • 所以我猜@GrimFandango 发现了这个问题,以及缺少向量的添加。来吧,回答吧。
  • 修复了空多集问题。为指出这一点而欢呼。

标签: c++ vector iterator multiset


【解决方案1】:

C++11 标准声称对于 值类型与键类型相同的关联容器,iterator 和 const_iterator 都是常量迭代器。

所以实际上multiset&lt;vector&lt;string&gt;&gt;::iteratorconst_iterator。与 std::set 迭代器相同的技巧 - 它们都是 const。

这意味着 vector&lt;string&gt;::iterator myOtherIterator = *myIterator.begin() 语句将失败,因为您尝试从 const 对象(由 *myIterator 给出,即 const)获取 non-const 迭代器。

要修复你需要使用vector&lt;string&gt;::const_iterator:

for(multiset<vector<string>>::const_iterator myIterator = setOfRules.begin(); 
    myIterator != setOfRules.end(); ++myIterator)
{
   for(vector<string>::const_iterator myOtherIterator = *myIterator.begin();     
      myOtherIterator != *myIterator.end(); ++myOtherIterator)
   {
      cout << *myOtherIterator << " ";
   }
   cout << endl;
}

【讨论】:

  • 无法投票,因为我的声誉不够高,但非常感谢您不仅解决了问题,还解释了原因!
【解决方案2】:

有一个普通的multiset&lt;XXX&gt;::iterator myIterator 是错误的,因为如果你这样做 *myIterator = ...; 那你就毁了多重集。

改用const_iterator

for (multiset< vector <string > >::const_iterator myIterator = setOfRules.begin(); myIterator!=setOfRules.end(); ++myIterator) {

【讨论】:

  • 我想你会发现你在错误的地方应用了这个。另一个循环的迭代器需要是 const。在这里这样做不会有任何伤害,但也不会解决问题。
【解决方案3】:

我的猜测,这只是一个猜测,因为您没有显示所有需要知道的代码,是您使用了错误的迭代器类型。它似乎基于编译器呕吐物,您需要使用 const_iterator 因为您的对象是常量。

您不能分配给关联容器(如多重集)的关键部分。这意味着您的向量是常量。你需要 const iterator 来迭代它。

多重集似乎是非常量的。您不需要 const 迭代器来导航它。它包含的值类型的 const 特性将防止分配给键。

【讨论】:

  • 这是程序中的所有代码,除了 #include 等。但感谢您的尝试。
  • 哦,我还以为是sn-p。那么问题是您不能在函数之外执行这样的执行语句。您可以执行可以调用函数或执行单个语句的赋值,但不能在函数之外有大量语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2021-06-26
  • 2013-11-08
  • 2015-05-21
相关资源
最近更新 更多