элементы кортежа доступны только для чтения? - PullRequest
1 голос
/ 18 января 2020

Я пытаюсь создать программу для сканирования тегов 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|

Но кортеж не постоянный? Я также пробовал циклы для каждого диапазона, но все они дают мне ту же ошибку.

Ответы [ 2 ]

2 голосов
/ 18 января 2020

элементы кортежа доступны только для чтения?

Не в целом. Но элементы константного кортежа доступны только для чтения.

Но кортеж не является константным?

Элементы набора являются константными. Кортеж является элементом множества. Да, это постоянно. (Или, по крайней мере, доступ осуществляется через константную ссылку; я не уверен, гарантируется ли что-либо о константности самого объекта)

0 голосов
/ 18 января 2020

Это прекрасно компилируется (на всякий случай использовал все ваши включения):

#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";
}
...