Вы можете использовать nth0 / 4: например,
update_mat_rc(Mc,R,C,V,Mu) :-
nth0(R,Mc,Rc,Mt),
nth0(C,Rc,_,Rt),
nth0(C,Ru,V,Rt),
nth0(R,Mu,Ru,Mt).
?- update_mat_rc([[1,2,3],[4,5,6],[7,8,9]],1,1,x,M).
M = [[1, 2, 3], [4, x, 6], [7, 8, 9]].
Обратите внимание на порядок и имена переменных, передаваемых в nth0 / 4.
У меня есть суффиксы переменных с c (например, Mc
, Rc
) для обозначения тока , с t для обозначения временно [ 117], с и означает обновлено .
Есть функция для поиска подстроки в строке ( find
) и функция для замены определенного диапазона в строке другой строкой ( replace
), так что вы можете объедините их, чтобы получить желаемый эффект:
bool replace(std::string& str, const std::string& from, const std::string& to) {
size_t start_pos = str.find(from);
if(start_pos == std::string::npos)
return false;
str.replace(start_pos, from.length(), to);
return true;
}
std::string string("hello $name");
replace(string, "$name", "Somename");
В ответ на комментарий, я думаю, replaceAll
, вероятно, будет выглядеть примерно так:
void replaceAll(std::string& str, const std::string& from, const std::string& to) {
if(from.empty())
return;
size_t start_pos = 0;
while((start_pos = str.find(from, start_pos)) != std::string::npos) {
str.replace(start_pos, from.length(), to);
start_pos += to.length(); // In case 'to' contains 'from', like replacing 'x' with 'yx'
}
}
Это могло быть еще лучше для использования
void replace(string& input, const string& from, const string& to)
{
while(true)
{
size_t startPosition = input.find(from);
if(startPosition == string::npos)
break;
input.replace(startPosition, from.length(), to);
}
}
Да, вы можете это сделать, но вам нужно найти позицию первой строки с помощью члена find () строки, а затем заменить его членом replace ().
string s("hello $name");
size_type pos = s.find( "$name" );
if ( pos != string::npos ) {
s.replace( pos, 5, "somename" ); // 5 = length( $name )
}
Если вы планируете использовать Стандартную библиотеку, вам действительно стоит получить копию книги Стандартная библиотека C ++ , которая очень хорошо охватывает все это.
std :: string
имеет метод replace
, это то, что вы ищете?
Вы можете попробовать:
s.replace(s.find("$name"), sizeof("$name") - 1, "Somename");
У меня нет попробовал сам, просто прочтите документацию по find ()
и replace ()
.