我想知道,如果它是"安全的"设置string等于无论是通过取消引用现成的,最终返回iterator的vector的string秒.当我运行程序时
#include <vector>
#include <string>
int main()
{
std::vector<std::string> myVec;
std::cout << *myVec.end();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误.
/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/debug/safe_iterator.h:181:
error: attempt to dereference a past-the-end iterator.
Objects involved in the operation:
iterator "this" @ 0x0xffdb6088 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPSsN10__gnu_norm6vectorISsSaISsEEEEEN15__gnu_debug_def6vectorISsS6_EEEE (mutable iterator);
state = past-the-end;
references sequence with type `N15__gnu_debug_def6vectorISsSaISsEEE' @ 0x0xffdb6088
}
Disallowed system call: SYS_kill
Run Code Online (Sandbox Code Playgroud)
您可以在http://codepad.org/fJA2yM30上查看
我想知道这一切的原因是因为我的代码中有一个片段就像是
std::vector<const std::string>::iterator iter(substrings.begin()), offend(substrings.end());
while (true)
{
this_string = *iter;
if (_programParams.count(this_string) > …Run Code Online (Sandbox Code Playgroud) 我接受了Jr.开发工作的采访,他让我写了一个程序,它采取一系列的整数并将零推到后面.以下是约束(他在开始时没有告诉我......正如在编程访谈中经常发生的那样,我在解决问题的过程中学会了问题的约束)
建立:
int arr[] = {0, -2, 4, 0, 19, 69};
/* Transform arr to {-2, 4, 19, 69, 0, 0} or {69, 4, -2, 19, 0, 0}
or anything that pushes all the nonzeros to the back and keeps
all the nonzeros in front */
Run Code Online (Sandbox Code Playgroud)
我的答案:
bool f (int a, int b) {return a == 0;}
std::sort(arr, arr+sizeof(arr)/sizeof(int), f);
Run Code Online (Sandbox Code Playgroud)
还有什么其他好的答案?
我是GitHub的新手,主要是用它来备份服务和炫耀代码.无论如何,我正试图让我的最新程序在那里,当我试图推动时,我在这个线程的标题中得到错误.
Repro步骤:
据我所知,使用const和&所有其他花哨的C++东西,正如我在视频中所说的"帮助编译器"时所说的Bjarne Stroustrup.我理解如何&尽可能使用(引用)可以帮助提高程序的效率,但有一件事我不明白是多么const_iterator有用.假设我使用
#include <string>
#include <iostream>
int main()
{
const std::string s = "Vote for Pat Buchanan in 2016";
for (std::string::const_iterator i1(s.cbegin()), i2(s.cend()); i1 != i2; ++i1)
std::cout << *i1 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代替
#include <string>
#include <iostream>
int main()
{
const std::string s = "Vote for Pat Buchanan in 2016";
for (std::string::iterator i1(s.begin()), i2(s.end()); i1 != i2; ++i1)
std::cout << *i1 << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两者都有效.前者如何更有效率?如何通过使用const_iteratorgo来迭代字符串比使用常规字符串迭代更快 …
在诸如如何将std :: string转换为小写的 SO帖子上?,我已经看过语法::something,例如
std::transform(data.begin(), data.end(), data.begin(), ::tolower);
Run Code Online (Sandbox Code Playgroud)
而我想知道这意味着什么.我知道std :: transform查找transform名称空间内命名的函数或变量std.但是,当没有第一个参数时,范围运算符意味着什么?
我知道编写模板函数只是以一般方式编写内容,并且编译器应该根据程序的其余部分编写函数的实际实例.但请考虑以下计划:
#inlcude <time.h>
#include <stdlib.h>
#include <string>
template <typename T> void ptr_swap(T * a, T * b)
{
T * temp = a;
a = b;
b = temp;
}
int main()
{
srand(time(NULL));
std::string s1("Obama"), s2("Hillary");
int i1(1), i2(69);
if (rand() & 1 == 1) ptr_swap(&s1, &s2);
else ptr_swap(&i1, &i2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器如何知道是否为strings或ints 构造ptr_swap函数?它只是确保"为任何事情做好准备",从而编写2个功能
void ptr_swap(std::string * a, std::string * b)
{
std::string * temp = a;
a = b;
b = temp;
} …Run Code Online (Sandbox Code Playgroud) 我有一个类似的课程
class HtmlRover
{
public:
HtmlRover(const std::string::const_iterator &, const std::string::const_iterator &);
~HtmlRover();
// ...
private:
/...
std::string::const_iterator _curIter;
const std::string::const_iterator _offend;
/...
};
Run Code Online (Sandbox Code Playgroud)
我的编译器抱怨我_offend在构造函数的实现中的实例化:
HtmlRover::HtmlRover(const std::string::const_iterator & it1, const std::string::const_iterator & it2)
{
_curIter = it1;
_offend = it2;
}
Run Code Online (Sandbox Code Playgroud)
它说
No vaiable overload "="
Run Code Online (Sandbox Code Playgroud)
现在我明白这可能与const设置为变量引用的变量有关,但是引用也是const如此,那么问题是什么呢?我知道const变量不能在没有被初始化的情况下存在,但这也不应该是一个问题,因为_offend在初始化HtmlRover对象时正确初始化.