【问题标题】:tuple elements are read-only?元组元素是只读的?
【发布时间】:2020-01-18 03:25:19
【问题描述】:

我正在尝试制作一个程序来扫描 HRML 标记及其属性。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
#include<cmath>

#include<sstream>
#include<fstream>
#include<list>
#include<numeric>
#include<map>
#include<iterator>

#include<regex>
#include<climits> //#include"matrix.h"
#include<random>
#include<ctime>
#include<iomanip>

#include<set>

using namespace std; 
typedef tuple<string,vector<string>,bool> tagMap;

int main(){
    int n;
    int q;
    cin>>n>>q;
    cin.clear();
    cin.ignore(std::numeric_limits<int>::max());
    set<tagMap> TagHierarchy;
    vector<tuple<string,string,string>> tags;

    for(int i=0; i<n; ++i){
        string ln;
        getline(cin,ln);
        istringstream is{ln};
        string tagId;
        is>>tagId;
        if(find(tagId.begin(),tagId.end(),'/')!=tagId.end()){
            auto it=find_if(TagHierarchy.begin(),TagHierarchy.end(),[&](tagMap e){if(get<0>(e)==tagId)return true;return false;});
            get<2>(*it)=false; // Error is here
        }
        else{
            tagId.erase(remove(tagId.begin(),tagId.end(),'<'),tagId.end());
            for(auto& e:TagHierarchy){
                if(get<2>(e)){//active
                    vector<string> v=get<1>(e);
                    v.push_back(tagId);
                }
                else{//inactive

                }
            }
            TagHierarchy.insert(make_tuple(tagId,vector<string>{},true));
            string tagName;
            is>>tagName;
            char t;
            is>>t;
            string tagValue;
            is>>tagValue;
            tagValue.erase(remove(tagValue.begin(),tagValue.end(),'>'),tagValue.end());
            tags.push_back(make_tuple(tagId,tagName,tagValue));
        }

    }


}

问题出在第 45 行,在那里我扫描将标签更改为关闭,它给了我以下内容

error: assignment of read-only location 'std::get<2u, {std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, bool}>((* & it.std::_Rb_tree_const_iterator<_Tp>::operator*<std::tuple<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::__cxx11::basi|

但是元组不是 const 吗? 对于每个循环,我也尝试过 for-ranged 循环,但它们都给了我同样的错误。

【问题讨论】:

  • 问题出在第 45 行 最好在代码中用注释标记错误,至少写出您所指的行。您的代码中没有显示行号。

标签: c++ constants stdtuple


【解决方案1】:

元组元素是只读的?

一般不会。但是 const 元组的元素是只读的。

但是元组不是 const 吗?

集合的元素是常量。元组是集合的一个元素。是的,它是常量。 (或者至少是通过 const 引用进行访问;我不确定是否可以保证对象本身的 const 性)

【讨论】:

    【解决方案2】:

    这编译得很好(使用你所有的包含以防万一):

    #include<iostream>
    #include<string>
    #include<string.h>
    #include<vector>
    #include<algorithm>
    #include<cmath>
    
    #include<sstream>
    #include<fstream>
    #include<list>
    #include<numeric>
    #include<map>
    #include<iterator>
    
    #include<regex>
    #include<climits> //#include"matrix.h"
    #include<random>
    #include<ctime>
    #include<iomanip>
    
    #include<set>
    
    main() {
            std::tuple<std::string,std::string,std::string> t;
    
            std::get<0>(t) = "123";
            std::get<1>(t) = "234";
            std::get<2>(t) = "345";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2021-06-29
      • 2011-03-15
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多